C#编译器认为应该初始化这些变量

时间:2014-06-24 20:28:34

标签: c#

以下是我正在编写的应用程序示例:

        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
        {

        }

我不理解,在空合并链中,如果comparisonnull并且我不提前返回,x3k将如何未初始化。这里发生了什么?

2 个答案:

答案 0 :(得分:5)

您遇到短路行为:如果DoSomethingDoSomething2返回非空的内容,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未初始化。