2017-01-26 5 views
2

私はこの質問をするための簡単な例を作成しました。ToString()を暗黙的に使用しても例外が発生しないのはなぜですか?

次のコードはコンパイルして実行します:

static void Main(string[] args) 
{ 
    string bigString, littleString; 
    littleString = null; 
    bigString = "word " + littleString + " word"; 
} 

このコードはコンパイルされますが、実行時NullReference例外がスローされます。

static void Main(string[] args) 
{ 
    string bigString, littleString; 
    littleString = null; 
    bigString = "word " + littleString.ToString() + " word"; 
} 

なぜ、最初のコードでも同様の例外は発生しませんか? ToString()を暗黙的に使用する他の文字列と連結するためには、2番目のコードと同じ根本的な問題が発生すると思います。

+4

内部的に['String.Concat'](https:// msdn。このケースを処理するmicrosoft.com/en-us/library/kbseaaft(v=vs.110).aspx)が使用されています:_ "String.Emptyがヌル引数の代わりに使用されています" _ –

+3

なぜ最初の例は 'ToString'をまったく含んでいますか? – Luaan

答えて

9

最初のスニペットでは、ToStringはまったく呼び出されません。それはstring.Concat(string, string)を呼び出し、その実装では、空の文字列であるかのようにnull値を処理します。 はすでにstringであるため、であるかどうかにかかわらず、にその引数を変換するためにToStringを呼び出す必要はありません。 (でない場合stringの場合、ToStringを呼び出す必要がありますが、それがnullでない場合にのみ適用されます)。

3

方法String.Concat作品です。演算子+(文字列値の場合)は、null文字列を空の文字列に置き換えるstring.Concatを使用します。したがって、NULL値の文字列連結で暗黙的にToStringを呼び出すことはありません。

2番目のコードスニペットでは、明示的にヌル値でToStringを呼び出しているため、例外です。文字列連結動作において

How to: Concatenate Multiple Strings (C# Programming Guide)

、C#コンパイラは、空の文字列と同じヌル 列を扱い、それが元のヌル文字列の値 を変換しません。

7.7.4 Addition operator

一方または両方 オペランドが文字列型である場合にバイナリ+演算子は文字列の連結を行います。

文字列連結のオペランドがnullの場合、空の文字列が代入されます。それ以外の場合、文字列以外の引数は、型オブジェクトから継承した仮想ToStringメソッド を呼び出すことによって、文字列表現 に変換されます。

関連する問題