ToString для нулевой строки

Почему вторая из них создает исключение, а первая не работает?

string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());

Обновлено - исключение, которое я могу понять, загадочный бит (для меня) - это то, почему первая часть не показывает исключения. Это не имеет ничего общего с Messagebox, как показано ниже.

Например:

string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error

Первая часть представляется неявным преобразованием нулевой в пустую строку.

Ответ 1

потому что вы не можете вызвать метод экземпляра ToString() по ссылке null.

И MessageBox.Show(), вероятно, реализован, чтобы игнорировать пустое и распечатать пустое поле сообщения.

Ответ 2

Это потому, что MessageBox.Show() реализован с помощью pinvoke, он вызывает собственную функцию Windows MessageBox(). Который не возражает против получения NULL для аргумента lpText. Язык С# имеет гораздо более строгие правила для чистых методов экземпляра .NET(например, ToString), он всегда испускает код для проверки того, что объект не является нулевым. Там есть некоторая справочная информация об этом в этом сообщении .

Ответ 3

За кулисами concat вызывается в вашем следующем вопросе/обновлении. Например,

string snull = null;

string msg = "hello" + snull;

// is equivalent to the line below and concat handles the null string for you.
string msg = String.Concat("hello", snull);

// second example fails because of the toString on the null object
string msg = String.Concat("hello", snull.ToString());

//String.Format, String.Convert, String.Concat all handle null objects nicely.

Ответ 4

Вы пытаетесь выполнить метод ToString() в нуле. Для выполнения метода нужен действительный объект.

Ответ 5

Функция .show должна иметь нулевую проверку и обрабатывать ее.

Ответ 6

Потому что второй вызов ожидает, что объект "s" удовлетворяет запросу метода ToString(). поэтому, прежде чем вызывается .Show(), s.ToString() не удался с попыткой вызвать метод.

Интересно, что хотя .Show() реализовано правильно, многие такие методы ожидают, что непустые экземпляры будут переданы. Обычно это когда вы используете NullObject, чтобы вызывающий абонент не должен был иметь дело с таким поведением.

Ответ 7

Вероятно, метод Show обрабатывает нулевое значение и просто ничего не показывает. Второе использование s - s.ToString() терпит неудачу, потому что у вас нет метода ToString для запуска.