![]() |
1
31
因为你可以
override
正在运行
这里的另一个问题是:为什么编译器不为
那
可能会得到@aaronaught的回复。这也是你应该做的原因
|
![]() |
2
24
我不同意。我觉得你还是说得对。 编译器知道比较是否将转到用户定义的比较运算符,并且编译器知道如果不转到,则“this”永远不会为空。
事实上,编译器
做
跟踪给定表达式在法律上是否可以为空,以便在非虚拟方法调用上实现较小的优化。如果你有一个非虚拟方法m,你说
现在,如果我们
可以
不做空值检查就走吧。如果你说
所以编译器有很好的数据来说明与空值的特殊比较有时、总是或永远不会成功。 问题是“如果编译器知道特定的比较永远不会成功,为什么不为它生成一个警告?” 答案是“有时我们做,有时我们不做”。 在这种情况下:
在两个可为空的int上定义了一个相等运算符。x可转换为nullable int。nullable可转换为nullable int。因此,equality运算符是有效的,因此被使用,当然始终为false。编译器给出一个警告,说明表达式始终为假。 但是,由于我们在C 3中意外引入了一个错误,此代码不会产生该警告:
一言为定。可以为空的guid相等运算符有效,但不显示警告。我不确定我们是否为C 4修正了这个错误。如果没有,希望我们能把它放到一个服务包中。 至于“if(this==null)”,我不知道为什么我们不发出警告。这显然是一个很好的警告候选人。最可能的解释是遵循这种逻辑三段论:
有无限多的编译器特性我们还没有想到;我们没有实现它们中的任何一个。 这里不给出警告的另一个原因是我们试图在代码上给出警告,这两个代码都是 可能是偶然打出来的 和 几乎肯定是错误的,因为一个不明显的原因 . "这个==null“不太可能是偶然输入的,尽管它几乎肯定是错误的,正如您在问题陈述中所指出的,它是 明显地 错了。 将其与我们的“guid==null”进行比较——这很可能是偶然发生的,因为开发人员可能会意外地认为guid是引用类型。GUID通常在C++中通过引用传递,所以这是一个容易犯的错误。代码几乎肯定是错误的,但它是以一种不明显的方式错误的。因此,这是一个很好的警告候选人。(这就是为什么这是C 2中的警告,而不是C 3中的警告,因为我们引入了一个错误。) |
![]() |
3
4
事实上,情况真的 can be satisfied 至少在Visual Studio 2008中。他们已经在2010年的vs中修正了这种行为,但也不是完全不可能有另一种方法来创造这样的条件。
(TL;DR版本-在C 3.5中,引用是合法的
|
![]() |
4
3
虽然下面的代码是一个混蛋,但仍然是C。如果您调用BAR,您将得到一个InvalidOperationException,消息为空。
|
![]() |
5
2
这也符合其他警告,如:
不管怎样,这些都会有相同的结果。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |