查看应用时所说的??
定义,如果它不为null或右操作数,则返回左操作数。但为什么这不起作用?
int? i = null;
string s = i ?? "some string";
是否要求可空类型匹配正确的操作数类型?
答案 0 :(得分:7)
??
是以下逻辑语句的语法糖(在本例中)。
int? i = null;
string s = null;
if (i != null)
{
s = i;
}
else
{
s = "some string";
}
显然,编译器永远不会接受这个并且它不会被编译,因为我无法隐式地转换为s。编译器不会为空合并运算符设置异常,并强制执行类型要求。
如果您绝对希望能够在单行中对混合类型使用空合并运算符,则需要通过其他方法执行类型转换。
您不能简单地调用i.ToString()
,因为如果i
为空,则返回空字符串而不是null,从而导致将空字符串分配给s
而不是& #34;一些字符串"。因此,您需要类似以下通用扩展方法的内容:
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
将被赋值为&#34;某些字符串&#34;因为扩展方法会正确保留可空值,允许空合并运算符选择非空替代。