Object.ToString メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在のオブジェクトを表す文字列を返します。
public:
virtual System::String ^ ToString();
public virtual string ToString ();
public virtual string? ToString ();
abstract member ToString : unit -> string
override this.ToString : unit -> string
Public Overridable Function ToString () As String
戻り値
現在のオブジェクトを表す文字列。
注釈
Object.ToStringは、.NET Frameworkの主要な書式設定方法です。 オブジェクトを文字列表現に変換して、表示に適しています。 (.NET Frameworkでの書式設定のサポートについては、「型の書式設定」を参照してください)。メソッドの既定の実装では、Object.ToStringオブジェクトの型の完全修飾名が返されます。
重要
別の種類のメンバー リストのリンクに従って、このページにアクセスした可能性があります。 これは、その型が をオーバーライド Object.ToStringしないためです。 代わりに、 メソッドの機能を Object.ToString 継承します。
型はメソッドを Object.ToString オーバーライドして、特定の型のより適切な文字列表現を提供する場合がよくあります。 また、型はメソッドを Object.ToString オーバーロードして、書式指定文字列やカルチャに依存する書式設定をサポートします。
このセクションの内容は次のとおりです。
既定の Object.ToString() メソッド
Object.ToString() メソッドのオーバーライド
ToString メソッドのオーバーロード
Object.ToString メソッドの拡張
Windows ランタイムに関する注意事項
既定の Object.ToString() メソッド
メソッドの既定の実装では、次の ToString 例に示すように、 の型の Object完全修飾名が返されます。
using namespace System;
void main()
{
Object^ obj = gcnew Object();
Console::WriteLine(obj->ToString());
}
// The example displays the following output:
// System.Object
Object obj = new Object();
Console.WriteLine(obj.ToString());
// The example displays the following output:
// System.Object
let obj = obj ()
printfn $"{obj.ToString()}"
// printfn $"{obj}" // Equivalent
// The example displays the following output:
// System.Object
Module Example
Public Sub Main()
Dim obj As New Object()
Console.WriteLine(obj.ToString())
End Sub
End Module
' The example displays the following output:
' System.Object
は.NET Framework内のすべての参照型の基底クラスであるためObject、この動作は メソッドをオーバーライドToStringしない参照型によって継承されます。 次の例を使って説明します。 すべてのObjectメンバーの既定の実装を受け入れる という名前Object1
のクラスを定義します。 そのメソッドは ToString 、オブジェクトの完全修飾型名を返します。
using namespace System;
namespace Examples
{
ref class Object1
{
};
}
void main()
{
Object^ obj1 = gcnew Examples::Object1();
Console::WriteLine(obj1->ToString());
}
// The example displays the following output:
// Examples.Object1
using System;
using Examples;
namespace Examples
{
public class Object1
{
}
}
public class Example
{
public static void Main()
{
object obj1 = new Object1();
Console.WriteLine(obj1.ToString());
}
}
// The example displays the following output:
// Examples.Object1
type Object1() = class end
let obj1 = Object1()
printfn $"{obj1.ToString()}"
// The example displays the following output:
// Examples.Object1
Imports Examples
Namespace Examples
Public Class Object1
End Class
End Namespace
Module Example
Public Sub Main()
Dim obj1 As New Object1()
Console.WriteLine(obj1.ToString())
End Sub
End Module
' The example displays the following output:
' Examples.Object1
Object.ToString() メソッドのオーバーライド
型は通常、 メソッドを Object.ToString オーバーライドしてオブジェクト インスタンスを表す文字列を返します。 たとえば、 などのCharInt32基本型は、Stringオブジェクトが表す値の文字列形式を返す実装を提供ToStringします。 次の例では、 Object2
メソッドをオーバーライド ToString して型名とその値を返す クラスを定義します。
using namespace System;
ref class Object2
{
private:
Object^ value;
public:
Object2(Object^ value)
{
this->value = value;
}
virtual String^ ToString() override
{
return Object::ToString() + ": " + value->ToString();
}
};
void main()
{
Object2^ obj2 = gcnew Object2(L'a');
Console::WriteLine(obj2->ToString());
}
// The example displays the following output:
// Object2: a
using System;
public class Object2
{
private object value;
public Object2(object value)
{
this.value = value;
}
public override string ToString()
{
return base.ToString() + ": " + value.ToString();
}
}
public class Example
{
public static void Main()
{
Object2 obj2 = new Object2('a');
Console.WriteLine(obj2.ToString());
}
}
// The example displays the following output:
// Object2: a
type Object2(value: obj) =
inherit obj ()
override _.ToString() =
base.ToString() + ": " + value.ToString()
let obj2 = Object2 'a'
printfn $"{obj2.ToString()}"
// The example displays the following output:
// Object2: a
Public Class Object2
Private value As Object
Public Sub New(value As Object)
Me.value = value
End Sub
Public Overrides Function ToString() As String
Return MyBase.ToString + ": " + value.ToString()
End Function
End Class
Module Example
Public Sub Main()
Dim obj2 As New Object2("a"c)
Console.WriteLine(obj2.ToString())
End Sub
End Module
' The example displays the following output:
' Object2: a
次の表に、.NET の型カテゴリを示し、メソッドを Object.ToString オーバーライドするかどうかを示します。
型のカテゴリ | Object.ToString() をオーバーライドします | 動作 |
---|---|---|
クラス | 該当なし | 該当なし |
構造 | はい (ValueType.ToString) | Object.ToString() と同じ |
列挙 | はい (Enum.ToString()) | メンバー名 |
Interface | いいえ | 該当なし |
Delegate | いいえ | 該当なし |
のオーバーライドの詳細については、「継承者へのメモ」セクションを ToString参照してください。
ToString メソッドのオーバーロード
パラメーターなしの Object.ToString() メソッドをオーバーライドするだけでなく、多くの型で メソッドがオーバーロードされ ToString
、パラメーターを受け入れるメソッドのバージョンが提供されます。 最も一般的に、これは、変数の書式設定とカルチャに依存する書式設定のサポートを提供するために行われます。
次の例では、 メソッドを ToString
オーバーロードして、クラスのさまざまなフィールドの値を含む結果文字列を Automobile
返します。 これは、モデル名と年を返す G という 4 つの書式指定文字列を定義します。D: モデル名、年、ドア数を返します。モデル名、年、シリンダー数を返す C。と A。4 つのフィールド値をすべて含む文字列を返します。
using System;
public class Automobile
{
private int _doors;
private string _cylinders;
private int _year;
private string _model;
public Automobile(string model, int year , int doors,
string cylinders)
{
_model = model;
_year = year;
_doors = doors;
_cylinders = cylinders;
}
public int Doors
{ get { return _doors; } }
public string Model
{ get { return _model; } }
public int Year
{ get { return _year; } }
public string Cylinders
{ get { return _cylinders; } }
public override string ToString()
{
return ToString("G");
}
public string ToString(string fmt)
{
if (string.IsNullOrEmpty(fmt))
fmt = "G";
switch (fmt.ToUpperInvariant())
{
case "G":
return string.Format("{0} {1}", _year, _model);
case "D":
return string.Format("{0} {1}, {2} dr.",
_year, _model, _doors);
case "C":
return string.Format("{0} {1}, {2}",
_year, _model, _cylinders);
case "A":
return string.Format("{0} {1}, {2} dr. {3}",
_year, _model, _doors, _cylinders);
default:
string msg = string.Format("'{0}' is an invalid format string",
fmt);
throw new ArgumentException(msg);
}
}
}
public class Example
{
public static void Main()
{
var auto = new Automobile("Lynx", 2016, 4, "V8");
Console.WriteLine(auto.ToString());
Console.WriteLine(auto.ToString("A"));
}
}
// The example displays the following output:
// 2016 Lynx
// 2016 Lynx, 4 dr. V8
open System
type Automobile(model: string, year: int, doors: int, cylinders: string) =
member _.Doors = doors
member _.Model = model
member _.Year = year
member _.Cylinders = cylinders
override this.ToString() =
this.ToString "G"
member _.ToString(fmt) =
let fmt =
if String.IsNullOrEmpty fmt then "G"
else fmt.ToUpperInvariant()
match fmt with
| "G" ->
$"{year} {model}"
| "D" ->
$"{year} {model}, {doors} dr."
| "C" ->
$"{year} {model}, {cylinders}"
| "A" ->
$"{year} {model}, {doors} dr. {cylinders}"
| _ ->
raise (ArgumentException $"'{fmt}' is an invalid format string")
let auto = Automobile("Lynx", 2016, 4, "V8")
printfn $"{auto}"
printfn $"""{auto.ToString "A"}"""
// The example displays the following output:
// 2016 Lynx
// 2016 Lynx, 4 dr. V8
Public Class Automobile
Private _doors As Integer
Private _cylinders As String
Private _year As Integer
Private _model As String
Public Sub New(model As String, year As Integer, doors As Integer,
cylinders As String)
_model = model
_year = year
_doors = doors
_cylinders = cylinders
End Sub
Public ReadOnly Property Doors As Integer
Get
Return _doors
End Get
End Property
Public ReadOnly Property Model As String
Get
Return _model
End Get
End Property
Public ReadOnly Property Year As Integer
Get
Return _year
End Get
End Property
Public ReadOnly Property Cylinders As String
Get
Return _cylinders
End Get
End Property
Public Overrides Function ToString() As String
Return ToString("G")
End Function
Public Overloads Function ToString(fmt As String) As String
If String.IsNullOrEmpty(fmt) Then fmt = "G"
Select Case fmt.ToUpperInvariant()
Case "G"
Return String.Format("{0} {1}", _year, _model)
Case "D"
Return String.Format("{0} {1}, {2} dr.",
_year, _model, _doors)
Case "C"
Return String.Format("{0} {1}, {2}",
_year, _model, _cylinders)
Case "A"
Return String.Format("{0} {1}, {2} dr. {3}",
_year, _model, _doors, _cylinders)
Case Else
Dim msg As String = String.Format("'{0}' is an invalid format string",
fmt)
Throw New ArgumentException(msg)
End Select
End Function
End Class
Module Example
Public Sub Main()
Dim auto As New Automobile("Lynx", 2016, 4, "V8")
Console.WriteLine(auto.ToString())
Console.WriteLine(auto.ToString("A"))
End Sub
End Module
' The example displays the following output:
' 2016 Lynx
' 2016 Lynx, 4 dr. V8
次の例では、オーバーロードされた Decimal.ToString(String, IFormatProvider) メソッドを呼び出して、通貨値のカルチャに依存する書式を表示します。
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] cultureNames = { "en-US", "en-GB", "fr-FR",
"hr-HR", "ja-JP" };
Decimal value = 1603.49m;
foreach (var cultureName in cultureNames) {
CultureInfo culture = new CultureInfo(cultureName);
Console.WriteLine("{0}: {1}", culture.Name,
value.ToString("C2", culture));
}
}
}
// The example displays the following output:
// en-US: $1,603.49
// en-GB: £1,603.49
// fr-FR: 1 603,49 €
// hr-HR: 1.603,49 kn
// ja-JP: ¥1,603.49
open System.Globalization
let cultureNames =
[| "en-US"; "en-GB"; "fr-FR"; "hr-HR"; "ja-JP" |]
let value = 1603.49m
for cultureName in cultureNames do
let culture = CultureInfo cultureName
printfn $"""{culture.Name}: {value.ToString("C2", culture)}"""
// The example displays the following output:
// en-US: $1,603.49
// en-GB: £1,603.49
// fr-FR: 1 603,49 €
// hr-HR: 1.603,49 kn
// ja-JP: ¥1,603.49
Imports System.Globalization
Module Example
Public Sub Main()
Dim cultureNames() As String = { "en-US", "en-GB", "fr-FR",
"hr-HR", "ja-JP" }
Dim value As Decimal = 1603.49d
For Each cultureName In cultureNames
Dim culture As New CultureInfo(cultureName)
Console.WriteLine("{0}: {1}", culture.Name,
value.ToString("C2", culture))
Next
End Sub
End Module
' The example displays the following output:
' en-US: $1,603.49
' en-GB: £1,603.49
' fr-FR: 1 603,49 €
' hr-HR: 1.603,49 kn
' ja-JP: ¥1,603.49
書式指定文字列とカルチャに依存する書式設定の詳細については、「 型の書式設定」を参照してください。 数値でサポートされる書式指定文字列については、「 標準の数値書式指定文字列 」および「 カスタム数値書式指定文字列」を参照してください。 日付と時刻の値でサポートされる書式指定文字列については、「 標準の日付と時刻の書式指定文字列 」および「 ユーザー設定の日付と時刻の書式指定文字列」を参照してください。
Object.ToString メソッドの拡張
型は既定 Object.ToString のメソッドを継承するため、その動作が望ましくなく、変更する必要がある場合があります。 これは、配列とコレクション クラスに特に当てはまります。 次の例に示すように、配列またはコレクション クラスのメソッドにメンバーの値が表示されると予想 ToString
される場合があります。代わりに、型の完全修飾型名が表示されます。
int[] values = { 1, 2, 4, 8, 16, 32, 64, 128 };
Console.WriteLine(values.ToString());
List<int> list = new List<int>(values);
Console.WriteLine(list.ToString());
// The example displays the following output:
// System.Int32[]
// System.Collections.Generic.List`1[System.Int32]
let values = [| 1; 2; 4; 8; 16; 32; 64; 128 |]
printfn $"{values}"
let list = ResizeArray values
printfn $"{list}"
// The example displays the following output:
// System.Int32[]
// System.Collections.Generic.List`1[System.Int32]
Imports System.Collections.Generic
Module Example
Public Sub Main()
Dim values() As Integer = { 1, 2, 4, 8, 16, 32, 64, 128 }
Console.WriteLine(values.ToString())
Dim list As New List(Of Integer)(values)
Console.WriteLine(list.ToString())
End Sub
End Module
' The example displays the following output:
' System.Int32[]
' System.Collections.Generic.List`1[System.Int32]
結果文字列を生成するには、いくつかのオプションがあります。
型が 配列、コレクション オブジェクト、または インターフェイスを実装IEnumerableIEnumerable<T>するオブジェクトである場合は、C# の ステートメントまたは Visual Basic の コンストラクトを
foreach
使用してその要素をFor Each...Next
列挙できます。クラスが (C#の場合) または
NotInheritable
(Visual Basic の場合) でないsealed
場合は、カスタマイズするメソッドを持つObject.ToString基底クラスから継承するラッパー クラスを開発できます。 少なくとも、次の操作を行う必要があります。必要なコンストラクターを実装します。 派生クラスは、基底クラスのコンストラクターを継承しません。
メソッドを Object.ToString オーバーライドして、必要な結果文字列を返します。
次の例では、 クラスのラッパー クラスを List<T> 定義します。 メソッドを Object.ToString オーバーライドして、完全修飾型名ではなく、コレクションの各メソッドの値を表示します。
using System; using System.Collections.Generic; public class CList<T> : List<T> { public CList(IEnumerable<T> collection) : base(collection) { } public CList() : base() {} public override string ToString() { string retVal = string.Empty; foreach (T item in this) { if (string.IsNullOrEmpty(retVal)) retVal += item.ToString(); else retVal += string.Format(", {0}", item); } return retVal; } } public class Example { public static void Main() { var list2 = new CList<int>(); list2.Add(1000); list2.Add(2000); Console.WriteLine(list2.ToString()); } } // The example displays the following output: // 1000, 2000
open System open System.Collections.Generic type CList<'T>() = inherit ResizeArray<'T>() override this.ToString() = let mutable retVal = String.Empty for item in this do if String.IsNullOrEmpty retVal then retVal <- retVal + string item else retVal <- retVal + $", {item}" retVal let list2 = CList() list2.Add 1000 list2.Add 2000 printfn $"{list2}" // The example displays the following output: // 1000, 2000
Imports System.Collections.Generic Public Class CList(Of T) : Inherits List(Of T) Public Sub New(capacity As Integer) MyBase.New(capacity) End Sub Public Sub New(collection As IEnumerable(Of T)) MyBase.New(collection) End Sub Public Sub New() MyBase.New() End Sub Public Overrides Function ToString() As String Dim retVal As String = String.Empty For Each item As T In Me If String.IsNullOrEmpty(retval) Then retVal += item.ToString() Else retval += String.Format(", {0}", item) End If Next Return retVal End Function End Class Module Example Public Sub Main() Dim list2 As New CList(Of Integer) list2.Add(1000) list2.Add(2000) Console.WriteLine(list2.ToString()) End Sub End Module ' The example displays the following output: ' 1000, 2000
目的の結果文字列を返す 拡張メソッド を開発します。 この方法では、既定Object.ToStringのメソッドをオーバーライドできないことに注意してください (つまり、拡張機能クラス (C#) またはモジュール (Visual Basic では) は、元の型
ToString
のメソッドの代わりに呼び出される という名前ToString
のパラメーターなしのメソッドを持つことはできません。 パラメーターなしのToString
置換には、他の名前を指定する必要があります。次の例では、クラスを拡張 List<T> する 2 つのメソッドを定義します。パラメーターなしの
ToString2
メソッドと、書式指定文字列をToString
表すパラメーターを String 持つメソッドです。using System; using System.Collections.Generic; public static class StringExtensions { public static string ToString2<T>(this List<T> l) { string retVal = string.Empty; foreach (T item in l) retVal += string.Format("{0}{1}", string.IsNullOrEmpty(retVal) ? "" : ", ", item); return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }"; } public static string ToString<T>(this List<T> l, string fmt) { string retVal = string.Empty; foreach (T item in l) { IFormattable ifmt = item as IFormattable; if (ifmt != null) retVal += string.Format("{0}{1}", string.IsNullOrEmpty(retVal) ? "" : ", ", ifmt.ToString(fmt, null)); else retVal += ToString2(l); } return string.IsNullOrEmpty(retVal) ? "{}" : "{ " + retVal + " }"; } } public class Example { public static void Main() { List<int> list = new List<int>(); list.Add(1000); list.Add(2000); Console.WriteLine(list.ToString2()); Console.WriteLine(list.ToString("N0")); } } // The example displays the following output: // { 1000, 2000 } // { 1,000, 2,000 }
open System open System.Collections.Generic type List<'T> with member this.ToString2<'T>() = let mutable retVal = String.Empty for item in this do retVal <- retVal + $"""{if String.IsNullOrEmpty retVal then "" else ", "}{item}""" if String.IsNullOrEmpty retVal then "{}" else "{ " + retVal + " }" member this.ToString<'T>(fmt: string) = let mutable retVal = String.Empty for item in this do match box item with | :? IFormattable as ifmt -> retVal <- retVal + $"""{if String.IsNullOrEmpty retVal then "" else ", "}{ifmt.ToString(fmt, null)}""" | _ -> retVal <- retVal + this.ToString2() if String.IsNullOrEmpty retVal then "{}" else "{ " + retVal + " }" let list = ResizeArray() list.Add 1000 list.Add 2000 printfn $"{list.ToString2()}" printfn $"""{list.ToString "N0"}""" // The example displays the following output: // { 1000, 2000 } // { 1,000, 2,000 }
Imports System.Collections.Generic Imports System.Runtime.CompilerServices Public Module StringExtensions <Extension()> Public Function ToString2(Of T)(l As List(Of T)) As String Dim retVal As String = "" For Each item As T In l retVal += String.Format("{0}{1}", If(String.IsNullOrEmpty(retVal), "", ", "), item) Next Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }") End Function <Extension()> Public Function ToString(Of T)(l As List(Of T), fmt As String) As String Dim retVal As String = String.Empty For Each item In l Dim ifmt As IFormattable = TryCast(item, IFormattable) If ifmt IsNot Nothing Then retVal += String.Format("{0}{1}", If(String.IsNullOrEmpty(retval), "", ", "), ifmt.ToString(fmt, Nothing)) Else retVal += ToString2(l) End If Next Return If(String.IsNullOrEmpty(retVal), "{}", "{ " + retVal + " }") End Function End Module Module Example Public Sub Main() Dim list As New List(Of Integer) list.Add(1000) list.Add(2000) Console.WriteLine(list.ToString2()) Console.WriteLine(list.ToString("N0")) End Sub End Module ' The example displays the following output: ' { 1000, 2000 } ' { 1,000, 2,000 }
Windows ランタイムに関する注意事項
Windows ランタイム内のToStringクラスで メソッドを呼び出すと、 をオーバーライドToStringしないクラスの既定の動作が提供されます。 これは、.NET FrameworkがWindows ランタイムに提供するサポートの一部です (「Windows ストア アプリとWindows ランタイムのサポート.NET Framework参照)。 Windows ランタイムのクラスは を継承Objectせず、 を常に実装ToStringするとは限りません。 ただし、C# または Visual Basic コードで使用すると、常に ToStringEquals(Object)、、および GetHashCode メソッドが含まれているように見え、.NET Frameworkではこれらのメソッドの既定の動作が提供されます。
.NET Framework 4.5.1 以降では、共通言語ランタイムは Windows ランタイム オブジェクトで IStringable.ToString を使用してから、 の既定のObject.ToString実装にフォールバックします。
注意
C# または Visual Basic で記述されたクラスWindows ランタイム、 メソッドをToStringオーバーライドできます。
Windows ランタイムと IStringable インターフェイス
Windows 8.1以降、Windows ランタイムには IStringable インターフェイスが含まれています。その 1 つのメソッドである IStringable.ToString は、 によってObject.ToString提供されるのと同等の基本的な書式設定のサポートを提供します。 あいまいさを防ぐために、マネージド型に IStringable を実装しないでください。
マネージド オブジェクトがネイティブ コードまたは JavaScript や C++/CX などの言語で記述されたコードによって呼び出されると、 IStringable を実装しているように見えます。 共通言語ランタイムは、IStringable がマネージド オブジェクトに実装されていない場合、IStringable.ToString から へのObject.ToString呼び出しを自動的にルーティングします。
警告
共通言語ランタイムでは、Windows ストア アプリのすべてのマネージド型に対して IStringable が自動的に実装されるため、独自 IStringable
の実装を提供しないことをお勧めします。 を実装IStringable
すると、Windows ランタイム、C++/CX、または JavaScript から を呼び出ToString
すときに意図しない動作が発生する可能性があります。
Windows ランタイム コンポーネントでエクスポートされるパブリック マネージド型に IStringable を実装する場合は、次の制限が適用されます。
IStringable インターフェイスは、次のように "クラス実装" リレーションシップでのみ定義できます。
public class NewClass : IStringable
Public Class NewClass : Implements IStringable
インターフェイスに IStringable を実装することはできません。
パラメーターを IStringable 型として宣言することはできません。
IStringable は、メソッド、プロパティ、またはフィールドの戻り値の型にすることはできません。
次のようなメソッド定義を使用して、基底クラスから IStringable 実装を非表示にすることはできません。
public class NewClass : IStringable { public new string ToString() { return "New ToString in NewClass"; } }
代わりに、IStringable.ToString の実装で基底クラスの実装を常にオーバーライドする必要があります。
ToString
の実装を隠すことができるのは、厳密に型指定されたクラス インスタンスで呼び出す場合だけです。
さまざまな条件下で、ネイティブ コードから IStringable を実装するマネージド型への呼び出し、または ToString 実装を非表示にするマネージド型の呼び出しでは、予期しない動作が発生する可能性があることに注意してください。
注意 (継承者)
独自の型を実装するときは、 メソッドを ToString() オーバーライドして、それらの型に意味のある値を返す必要があります。 提供するよりも ToString() 書式設定をより細かく制御する必要がある派生クラスは、 インターフェイスを IFormattable 実装できます。 その ToString(String, IFormatProvider) メソッドを使用すると、書式設定を制御する書式指定文字列を定義し、カルチャ固有の書式設定に提供できるオブジェクトを使用 IFormatProvider できます。
メソッドのオーバーライドは、 ToString() 次のガイドラインに従う必要があります。
返される文字列は、人間がわかりやすく読みやすくする必要があります。
返される文字列は、オブジェクト インスタンスの値を一意に識別する必要があります。
返される文字列は、デバッガーによる表示に適した短い文字列にする必要があります。
ToString()オーバーライドでは、または null 文字列を返Emptyさないでください。
ToString()オーバーライドによって例外がスローされないようにする必要があります。
インスタンスの文字列表現がカルチャに依存する場合、または複数の方法で書式設定できる場合は、 インターフェイスを実装します IFormattable 。
返される文字列に機密情報が含まれている場合は、まず適切なアクセス許可を要求する必要があります。 要求が成功した場合は、機密情報を返すことができます。それ以外の場合は、機密情報を除外する文字列を返す必要があります。
ToString()デバッグの複雑さを回避するために、オーバーライドに観察可能な副作用を含めないようにする必要があります。 たとえば、 メソッドの呼び出しで ToString() インスタンス フィールドの値を変更することはできません。
型が解析メソッド (または
Parse
TryParse
メソッド、コンストラクター、または文字列から型のインスタンスをインスタンス化するその他の静的メソッド) を実装している場合は、メソッドによってToString()返される文字列をオブジェクト インスタンスに変換できることを確認する必要があります。