以下是我正在编写的应用程序示例:
bool x3k = false, y3k = false;
// all of these functions return nullable ints (int?)
var comparison =
DoSomething(x, y)
?? DoSomething2(x, y)
?? DoSomething3(x, y, out x3k, out y3k)
?? DoSomething4(x, y)
?? DoSomething5(x, y);
if (comparison.HasValue)
return comparison.Value;
if (x3k) // compiler error here if I don't init x3k
{
}
我不理解,在空合并链中,如果comparison
为null
并且我不提前返回,x3k将如何未初始化。这里发生了什么?
答案 0 :(得分:5)
您遇到短路行为:如果DoSomething
或DoSomething2
返回非空的内容,DoSomething3
将永远不会执行,从而离开x3k
和{{1}未初始化。
答案 1 :(得分:3)
您的程序由编译器扩展为:
bool x3k;
bool y3k;
var comparison = DoSomething(x, y);
if (!comparison) {
comparison = DoSomething2(x, y);
if (!comparison) {
comparison = DoSomething3(x, y, out x3k, out y3k);
if (!comparison) {
comparison = DomeSomething4(x, y);
if (!comparison) {
comparison = DoSomething5(x, y);
}
}
}
}
if (comparison.HasValue) return comparison.value;
if (x3k) {/* ... */}
只要其中一个函数返回非空值,就会打破if
嵌套。如果DoSomething3
未运行,则x3k
未初始化。只要其中一个函数返回非null,comparison.HasValue
将为true
,但编译器会将该属性视为在编译时无法确定的属性。因此,它认为comparison
可能为null,x3k
未初始化。