Тестирование на нулевую ссылку всегда возвращает false ... даже когда null - PullRequest
5 голосов
/ 05 февраля 2012

Если я скомпилирую следующий фрагмент кода с Visual C # 2010, я ВСЕГДА получу false:

object o = null;
Console.WriteLine("Is null: " + o == null); // returns false

Кто-нибудь знает, почему ???

Ответы [ 3 ]

11 голосов
/ 05 февраля 2012

Приоритет оператора.

Попробуйте

Console.WriteLine("Is null: " + (o == null));

В вашем коде First o добавляется к строке "Is null: ", которая затем проверяется, если она нулевая. Конечно, это не так, поэтому он оценивается как ложный. Ваш звонок такой же, как если бы вы просто написали

Console.WriteLine(false.ToString());

Вот почему печатается только "False", даже без вашей строки.

10 голосов
/ 05 февраля 2012

почему легко; думайте о том, что вы написали на самом деле так:

object o = null;
Console.WriteLine(("Is null: " + o) == null); // returns false

Это тестирование "Is null: " + o против null, которое всегда будет false. Это связано с правилами приоритета операторов, где + предшествует ==.

Вы должны явно применять парены, чтобы убедиться, что они работают так, как вы хотите:

Console.WriteLine("Is null: " + (o == null)); // returns true

Как отмечено в комментариях Джим Роудс :

Это одна из нескольких причин, по которым вы ВСЕГДА должны использовать круглые скобки и никогда не полагаться на правила приоритета компилятора.

Я заметил, что согласен; что я даже не пытаюсь самостоятельно запомнить правила приоритета операторов, вместо этого я все время говорю с паренсом. Кроме того, я полагаю, что это также одна из причин быть очень осторожным, полагаясь на неявное преобразование типов и / или методы с множественными перегрузками.

Я также хотел бы отметить, что мне действительно что-то нравится Ravadre отмечено в их ответе ; о том, почему был напечатан только «False», а не весь текст, который вы пытались напечатать.

8 голосов
/ 05 февраля 2012

Другие ответы правильно диагностировали проблему: приоритет оператора для объединения выше, чем равенство.Однако никто не обратил внимания на более фундаментальную ошибку в вашей программе, которая заключается в том, что вы вообще делаете конкатенацию.Лучший способ написать код:

Console.WriteLine("is null: {0}", obj == null);

Теперь не может быть проблемы с приоритетом оператора, потому что у рассматриваемого выражения есть только один оператор.

В общем, вам следует избегать строкиконкатенация и предпочтение подстановки строк при выполнении вывода.Проще сделать это правильно, гораздо гибче, легче локализовать программы, написанные с использованием этой техники, и т. Д.

...