用法?? 在Nullable <int>和string之间

Dan*_*søn 5 c# nullable

查看??它所说的定义,如果它不是null或右操作数,则返回左操作数.但为什么这不起作用?

int? i = null;
string s = i ?? "some string";
Run Code Online (Sandbox Code Playgroud)

是否要求可空类型匹配正确的操作数类型?

Dav*_*d L 7

?? 对于以下逻辑语句,它是一个语法糖(在本例中).

int? i = null;
string s = null;

if (i != null)
{
    s = i;
}
else 
{
    s = "some string";
} 
Run Code Online (Sandbox Code Playgroud)

显然,编译器永远不会接受这个并且它不会编译,因为我无法隐式地转换为s.编译器不会为空合并运算符创建异常,并强制执行类型要求.

如果您绝对希望能够在单行中对混合类型使用空合并运算符,则需要通过其他方法执行类型转换.

您不能简单地调用,i.ToString()因为如果i为null,则返回空字符串而不是null,从而导致将空字符串分配给s"some string".因此,您需要类似以下通用扩展方法的内容:

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

可以像这样使用:

int? i = null;
string s = i.ToNullableString() ?? "some string";
Run Code Online (Sandbox Code Playgroud)

s 将被赋予值"some string",因为扩展方法将正确保留可空值,允许空合并运算符选择非null替代.