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
永远不会被访问。对不起,我忘了这一点。这篇文章已经编辑过了。这个答案对我解释得很好。