C# 为什么允许我们使用由“定义”定义的参数;是";条件运算符的else子句中的表达式?

C# 为什么允许我们使用由“定义”定义的参数;是";条件运算符的else子句中的表达式?,c#,.net,if-statement,.net-core,conditional-operator,C#,.net,If Statement,.net Core,Conditional Operator,例如: int a = 3; int b = 4; int result = (a + b) is int sum && sum < 100 ? sum : sum - 1; inta=3; int b=4; int result=(a+b)是int sum&&sum单独在另一个表达式中间声明新变量的做法。 int a = 3; int b = 4; // error CS0165: Use of unassigned local variable 'sum' int

例如:

int a = 3;
int b = 4;

int result = (a + b) is int sum && sum < 100 ? sum : sum - 1;
inta=3;
int b=4;
int result=(a+b)是int sum&&sum<100吗?sum:sum-1 ;;

表达式
sum-1
有效,sum仍然在范围内,即使它处于else条件。为什么会这样?我认为,如果
is
表达式返回false,sum将承载其默认值,对于
int
而言,它是
0

编译器似乎可以证明
a+b
始终是
int
,因此它知道
is int
测试将始终运行,并且始终通过。因此,它知道无论在条件的其余部分发生什么,总是分配
sum

尝试使用可能不是
int
的内容,并查看是否出现错误:

int a = 3;
int b = 4;
object sumObject = a + b;

// error CS0165: Use of unassigned local variable 'sum'
int result = sumObject is int sum && sum < 100 ? sum : sum - 1;

将第一行代码更改为
long a=int.MaxValue
然后看看会发生什么。@mjwills是的,编译器会抛出一个编译时错误。如果我们有泛型或者装箱,我想情况就不一样了。它要么在编译时知道在
int
中,要么不知道。我怀疑其他场景会持续运行(如下面的@canton7所示)。var模式似乎更合适,因为这里不需要测试类型:
(a+b)是var sum
。上面说:var模式,一个总是成功的匹配,并将表达式的值绑定到一个新的局部变量。我不相信
(a+b)是var-sum&…
int-sum=a+b
,但我知道有些人更喜欢它……这里的问题
var
int
不是关于隐式和显式类型<代码>is int是一种类型测试,而
is var
仅用于创建临时变量。我知道,是的。我更强调使用<代码>是var < /COD>单独在另一个表达式中间声明新变量的做法。
int a = 3;
int b = 4;

// error CS0165: Use of unassigned local variable 'sum'
int result = false && (a + b) is int sum && sum < 100 ? sum : sum - 1;