C# 使用??介于Nullable<;int>;和字符串
查看C# 使用??介于Nullable<;int>;和字符串,c#,nullable,C#,Nullable,查看?定义,如果应用时返回左操作数(如果它不是null)或右操作数,则返回左操作数。但是为什么这不起作用呢 int? i = null; string s = i ?? "some string"; 是否要求可空类型与正确的操作数类型匹配??是以下逻辑语句的语法糖(在本例中) int? i = null; string s = null; if (i != null) { s = i; } else { s = "some string"; } 显然,编译器永远不会接受
?
定义,如果应用时返回左操作数(如果它不是null)或右操作数,则返回左操作数。但是为什么这不起作用呢
int? i = null;
string s = i ?? "some string";
是否要求可空类型与正确的操作数类型匹配?
?
是以下逻辑语句的语法糖(在本例中)
int? i = null;
string s = null;
if (i != null)
{
s = i;
}
else
{
s = "some string";
}
显然,编译器永远不会接受这一点,它也不会编译,因为我不能隐式转换为s。编译器不会为null合并运算符创建异常,它强制执行类型要求
如果您绝对希望能够在一行中为混合类型使用null合并运算符,则需要通过另一个方法执行类型转换
您不能简单地调用i.ToString()
,因为如果i
为null,则会返回一个空字符串而不是null,从而导致将一个空字符串分配给s
而不是“某个字符串”。因此,您需要类似以下通用扩展方法的内容:
public static string ToNullableString<T>(this Nullable<T> nullable) where T : struct
{
return nullable == null ? null : nullable.ToString();
}
s
将被分配值“some string”,因为扩展方法将正确保留可为null的值,从而允许null合并运算符选择非null的替代值
从C#6开始,您可以使用简化赋值,而不需要扩展方法
int? i = null;
string s = i?.ToString() ?? "some string";
在上面的示例中,检查
i
是否为null,如果不是null,则调用.ToString()
,并分配结果。否则,i
将被计算为null,这将导致null合并运算符优先,并且将“某些字符串”分配给s
您能否具体说明正在发生的情况和预期发生的情况?如果i
不是null
,该怎么办?你知道,int
不能分配给string
。谢谢你的解释。@DanielJabsøn不客气:)。如果它对你有帮助,一个被接受的答案总是非常感激的。
int? i = null;
string s = i?.ToString() ?? "some string";