Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用??介于Nullable<;int>;和字符串_C#_Nullable - Fatal编程技术网

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";