【发布时间】:2017-11-11 19:59:12
【问题描述】:
出于某种原因,M1() 会导致编译器错误,而执行相同操作的M2() 不会导致错误。知道为什么吗?
使用false == 应该与使用非运算符! 相同。
使用未赋值的局部变量“i”
class Program {
static void Main(string[] args) {
int x = 8;
M1(x);
M2(x);
} // Main()
public static void M1(Object obj) {
if (false == (obj is int i)) // Causes ERROR on WriteLine
return;
System.Console.WriteLine(i); // Use of unassigned local variable 'i'
}
public static void M2(Object obj) {
if (!(obj is int i)) // OKAY
return;
System.Console.WriteLine(i);
}
} // class Program
【问题讨论】:
-
似乎 i 超出了 M1 的范围 - 边缘情况查找?
-
@PatrickArtner 显然不是。如果
i超出范围,则错误不会显示“未分配的局部变量”。您只能为范围内的变量获取该错误。 -
@Aominè 我明白了。对骑士一无所知。我怀疑需要仔细阅读实际规范才能获得正确答案... Docs (docs.microsoft.com/en-us/dotnet/csharp/pattern-matching) 建议
if (a is Foo b)检查“表达式肯定分配匹配变量” - 很有可能规范隐含地禁止所有其他比较真/假。 -
顺便说一句,是时候放弃那些声称
== false与!相同的帖子了^_^ -
@M.kazemAkhgary,声称
== false与!在 C# 7 之前已经是错误的,因为可空布尔值的行为不同。对于bool? b = null;,if (b == false)编译得很好,但if(!b)抱怨无法从bool?转换为bool。