2014-09-03 3 views
2

У меня есть класс с именем Sample со строковым свойством Name, ToString(), переопределенным для возврата свойства Name.C# ?? оператор не печатает значение, если переменная равна нулю

Затем я создал два экземпляра s1 и s2, s1 инициализирован, и его свойство Name установлено на «ABC», а s2 установлено на null.

Когда я пытаюсь распечатать значения, используя? оператор C#, строка значений «Null» не печатается для s2.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Sample s1 = new Sample(); 
     s1.Name = "ABC"; 

     Sample s2 = null; 

     Console.WriteLine("Some Sample Name : " + s1 ?? "Null"); 
     Console.WriteLine("Some Sample Name : " + s2 ?? "Null"); 
     Console.ReadLine(); 
    } 
} 

class Sample 
{ 
    string _Name; 
    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; } 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Выход:

Some Sample Name : ABC 
Some Sample Name : 
+1

[7.2.1 старшинства операторов и ассоциативность] (http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71% 29.aspx) –

+1

Для моей статьи об этой общей ошибке см. Http://blog.coverity.com/2013/10/23/null-coalescing-bugs/ –

+1

Даже без ошибки приоритета оператор '??' просто неправильный оператор для использования здесь. Оператор '??' означает «использовать значение левой стороны, если оно не является нулевым, иначе используйте значение правой стороны», но это не значит, что вы пытаетесь представить здесь. Вы пытаетесь сказать «преобразовать левую сторону в строку, но если она равна нулю, то используйте правую сторону», и это операция * другого *. Оператор '??' не выполняет эту вторую операцию. Вам нужен оператор '?:'. –

ответ

5

Это operator precedence вопрос, ваш код делает первый +, сочетая "Some Sample Name : " буквальным с s1, затем применяет ?? к этому.

С s1 и s2 являются Sample, не String, вы не можете использовать s1 ?? "Null". Возможно, самое простое, что используется условный оператор:

Console.WriteLine("Some Sample Name : " + (s1 == null ? "Null" : s1.ToString())); 
Смежные вопросы