编译器不应该允许Guid == null

Lui*_*ipe 46 .net c# guid .net-3.5

下面描述的行为仅适用于.net-3.5

我刚刚遇到了C#编译器中最令人惊讶的行为;

我有以下代码:

Guid g1 = Guid.Empty;
bool b1= (g1 == null);
Run Code Online (Sandbox Code Playgroud)

好吧,Guid不可为空,因此永远不能等于null.我在第2行进行的比较总是返回false.

如果对整数做同样的事情,编译器会发出警告,说结果总是为false:

int x=0;
bool b2= (x==null);
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么编译器允许你将Guid与null进行比较
据我所知,它已经知道结果总是错误的.
内置转换是否以编译器假定null为可能值的方式完成?
我在这里错过了什么吗?

Eri*_*ert 81

马克是对的.定义自己的相等运算符的值类型自动获得定义的可升级版本,免费.采用两个可以为空的guid的可空等式运算符适用于这种情况,将被调用,并且将始终返回false.

在C#2中,这产生了一个警告,但由于某种原因,这停止了guid-to-null的警告但继续产生int-to-null的警告.我不知道为什么; 我还没来得及调查.

我为这个错误道歉; 在重写C#3中的可空逻辑时,我可能搞砸了一个警告检测代码路径.在语言中添加表达式树主要改变了可空算术运算的实现顺序; 我犯了许多错误移动代码.这是一些复杂的代码.

  • 你必须喜欢StackOverflow.还有什么地方可以在一个主要框架中提出问题,然后作者回来说oops. (16认同)

Mar*_*ers 13

比较是有效的,因为编译器将转换Guid为a Nullable<Guid>然后它是有意义的.

有关此处未发出警告的错误报告.

这里 这里从埃里克利珀一个更全面的解释.