??的用法Nullable<之间;int>和字符串

本文关键字:int 字符串 lt 用法 Nullable 之间 | 更新日期: 2023-09-27 17:53:48

看看??定义,它说当应用时返回左操作数,如果它不是null或右操作数。但为什么这不起作用呢?

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

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

??的用法Nullable<之间;int>和字符串

??是以下逻辑语句的语法糖(在本例中)。

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

显然,编译器永远不会接受这个,它不会编译,因为i不能隐式地强制转换为s。编译器不会对空合并操作符做出异常,它强制执行类型要求。

如果您绝对希望能够在单行中对混合类型使用空合并操作符,则需要通过另一个方法执行类型转换。

你不能简单地调用i.ToString(),因为这返回一个空字符串而不是null,如果i是空的,导致一个空字符串被分配给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将被赋值为"some string",因为扩展方法将正确地保留可为空的值,从而允许空合并运算符选择非空的替代值。


从c# 6开始,您可以使用Null传播操作符来简化赋值,而不需要扩展方法。

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

在上面的代码中,检查i是否为空,如果不为空,则调用.ToString()并分配结果。否则,i被求值为null,这将导致null合并运算符优先,并将"some string"赋值给s