私の知る限りConsole.WriteLine()
(またはConsole.Write()
)オブジェクトのToString()
メソッドを呼び出して、オブジェクトの文字列表現を取得しますか?つまり、これらの 2 つの呼び出しConsole.WriteLine()
は同じですよね?
Foo foo = new Foo();
Console.WriteLine(foo); // This is same as the one bellow
Console.WriteLine(foo.ToString());
そこで、次のような状況を想定してみましょう。Foo の配列のインスタンス化を宣言します。
Foo[] foos = new Foo[10]; // After this line all 10 Foos are `null`s
次に、Foos 自体をインスタンス化せずに、配列の任意の要素で Console.WriteLine() を呼び出します。したがって、この場合、Foos の配列があり、配列内のすべての Foo はnull
、Console.WriteLine() の呼び出しによって aNullReferenceException
がスローされるはずです。しかし、物事はあなたがこのように呼ぶ場合です
Console.WriteLine(foos[0])
コンソールウィンドウに書かれている以外は何も起こりませんが、Environment.NewLine
このように呼び出すと
Console.WriteLine(foos[0].ToString())
実際には をスローしNullReferenceException
ます。これら 2 つの呼び出しの違いは何ですか? 最初のものはToString()
明示的に呼び出さないことを意味しますが、とにかく Console.WriteLine() によって暗黙的に呼び出されるべきではありませんか? そしてNullReferenceException
、最初のケースで がスローされないのはなぜですか?