2015-06-04 3 views
5

Глядя на определение ??, оно говорит, что при применении возвращает левый операнд, если он не является нулевым или правильным операндом. Но почему это не работает?Использование? между Nullable <int> и строкой

int? i = null; 
string s = i ?? "some string"; 

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

+0

Можете ли вы сказать, что происходит в сравнении с тем, что вы ожидаете? – BSMP

+3

Что делать, если 'i' не' null'? Вы знаете, 'int' не может быть присвоено' string'. – Dmitry

ответ

7

?? является синтаксическим сахаром (в данном случае) для следующего логического утверждения.

int? i = null; 
string s = null; 

if (i != null) 
{ 
    s = i; 
} 
else 
{ 
    s = "some string"; 
} 

Очевидно, что компилятор никогда не принимает бы это, и это не будет компилировать, так как я не могу быть неявно приведен к с. Компилятор не делает исключение для операторов с нулевым коалесцентом и устанавливает требование типа.

Если вы абсолютно хотели иметь возможность использовать нулевой оператор коалесценции для смешанных типов в одной строке, вам нужно будет выполнить преобразование типа с помощью другого метода.

Вы не можете просто вызвать i.ToString(), так как это возвращает пустую строку вместо нуля, если i имеет значение null, в результате чего пустая строка должна быть назначена s вместо «некоторой строки». В результате, вам нужно будет что-то вроде следующего общего метода расширения:

public static string ToNullableString<T>(this Nullable<T> nullable) where T : struct 
{ 
    return nullable == null ? null : nullable.ToString(); 
} 

который может быть использован как так:

int? i = null; 
string s = i.ToNullableString() ?? "some string"; 

s будет присвоено значение «некоторые строки», так как метод расширения правильно сохранит значение с нулевым значением, позволяя нулевому коалесцирующему оператору выбирать альтернативу, отличную от нулевой.

+0

Спасибо за объяснение. –

+0

@ DanielJabsøn Добро пожаловать :). Если это вам помогло, принятый ответ всегда приветствуется. –

Смежные вопросы