Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#编译器认为应该初始化这些变量_C# - Fatal编程技术网

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

C#编译器认为应该初始化这些变量,c#,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 x

下面是我正在编写的一个应用程序示例:

        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
        {

        }

我不明白,在空合并链中,如果
比较
null
并且我没有提前返回,那么x3k怎么会被取消初始化。这里发生了什么?

您遇到了短路行为:如果
DoSomething
DoSomething2
返回非空值,
DoSomething3
将永远不会执行,因此,
x3k
y3k
未初始化。

您遇到了短路行为:如果
DoSomething
DoSomething2
返回非空值,
DoSomething3
将永远不会执行,因此,
x3k
y3k
未初始化。

编译器将程序扩展为:

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) {/* ... */}

只要其中一个函数返回非null值,
if
嵌套就会中断。如果
DoSomething3
未运行,
x3k
未初始化
comparison.HasValue
将在其中一个函数返回非null时变为
true
,但编译器将该属性视为编译时无法确定的内容。因此,它认为
比较
可能为空,并且
x3k
不能初始化。

编译器将您的程序扩展为:

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) {/* ... */}


只要其中一个函数返回非null值,
if
嵌套就会中断。如果
DoSomething3
未运行,
x3k
未初始化
comparison.HasValue
将在其中一个函数返回非null时变为
true
,但编译器将该属性视为编译时无法确定的内容。因此,它认为
comparison
可以为null,并且
x3k
不能初始化。

如果
DoSomething
返回非null,那么如何调用
DoSomething3
?如果未调用
DoSomething3
,这些变量是如何初始化的?空合并是短路。除了,在顶部有显式初始化。@500 InternalServerError:“如果我不初始化x3k”如果
DoSomething
返回非空,那么
DoSomething3
将如何调用?如果未调用
DoSomething3
,这些变量是如何初始化的?空合并是短路。除了,在顶部有显式初始化。@500 InternalServerError:“如果我不初始化x3k”,在
DoSomething
DoSomething2
返回非空值的情况下,
x3k
y3k
永远不会被访问,因为如果有非空值,我会提前返回。@FMM编译器没有那么聪明。编译器不能假设编译器可以提前检查有限多的项@feO2x请注意“如果我不初始化x3k,这里会出现编译器错误”注释。如果
DoSomething
DoSomething2
返回非空值,
x3k
y3k
永远不会被访问,因为如果有非空值,我会提前返回。@FMM编译器没有那么聪明。编译器不能假设编译器可以提前检查有限多的项@feO2x请注意“如果我不初始化x3k,这里会出现编译器错误”注释。如果
comparison
为非
null
x3k
将无法访问。对不起,我忘了这一点。这篇文章已经编辑过了。这个答案对我解释得很好。如果
比较
是非
空的
x3k
永远不会被访问。对不起,我忘了这一点。这篇文章已经编辑过了。这个答案对我解释得很好。