まず、なぜ が得られるのかという質問に答えましょうSystem.Collections.Generic.List[char]
。
コンソールに何かを出力するために使用しているメソッドはConsole.WriteLineです。リンクされたページに移動すると、そのメソッドの多くのオーバーロードが表示され、すべてが異なる種類のパラメーターを取ります。type の引数を渡すときにどちらが使用されているか考えてみましょうList<char>
。
そのリストを注意深く見ると、 を取るオーバーロードがないことがわかりますList<anything>
。ご存知のように、.NET ではすべての型が から派生します。System.Object
つまり、すべての型は の一種です System.Object
。C# コンパイラがメソッドのオーバーロードを選択しようとして、正確な型の解決に失敗すると、元に戻って一種の関係を探します。私たちの場合、一致する唯一のオーバーロードは、 を取るものSystem.Object
です。
では、このオーバーロードは何をするのでしょうか? 説明を読めば簡単に理解できます。
値が null の場合、行末記号のみが書き込まれます。それ以外の場合は、value の ToString メソッドが呼び出されてその文字列表現が生成され、結果の文字列が標準出力ストリームに書き込まれます。
さて、文字のリストを渡すと、ToString() メソッドが呼び出されます。のToString() メソッドをList<T>
見てみましょう。「ToString」リンクをクリックすると、System.Object.ToString()
ページが表示されることがわかります。これは、List 型が基本メソッドをオーバーライドしないことを意味します。それで、何をしObject.ToString()
ますか?
次の例に示すように、ToString メソッドの既定の実装は、オブジェクトの型の完全修飾名を返します。
謎解き!
Console.WriteLine(ex.Columns(line));
コンパイラを記述すると、渡されたパラメーターConsole.WriteLine(Object)
を呼び出すオーバーロードが呼び出さObject.ToString()
れ、型の完全修飾名が出力されます。
この知識があれば、文字自体を印刷するために何をすべきかを理解できます。たとえば、文字の配列を渡してConsole.WriteLine(Char[])
オーバーロードを呼び出すには、次のように記述します。Console.WriteLine(ex.Columns(line).ToArray());