??
является синтаксическим сахаром (в данном случае) для следующего логического утверждения.
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
будет присвоено значение «некоторые строки», так как метод расширения правильно сохранит значение с нулевым значением, позволяя нулевому коалесцирующему оператору выбирать альтернативу, отличную от нулевой.
Можете ли вы сказать, что происходит в сравнении с тем, что вы ожидаете? – BSMP
Что делать, если 'i' не' null'? Вы знаете, 'int' не может быть присвоено' string'. – Dmitry