【发布时间】:2011-12-27 01:15:51
【问题描述】:
this == null和obj == null时IEquatable<T>.Equals(T obj)应该怎么做?
1) 此代码由 F# 编译器在实现IEquatable<T> 时生成。可以看到当两个对象都是null时它返回true:
2) 类似的代码可以在问题“in IEquatable implementation is reference check necessary”或问题“Is there a complete IEquatable implementation reference?”中找到。当两个对象都是null 时,此代码返回false。
3)最后一个选项是说this == null时没有定义方法的行为。
【问题讨论】:
-
this == null的情况应该永远 (!!!) 发生。不确定 F# 的特性,但在 C# 中是这样。 -
call操作码调用方法时没有检查this != null。 -
@RadekMicek,这就是 C# 编译器为非静态静态方法调用发出
callvirt的原因。但也许 F# 只发出call... -
@Radek 即便如此,以上内容在 C# 中永远不会是正确的语义,并且在这种情况下永远不需要
null检查。即使在 VB 中,有一个MyClass关键字发出call而不是callvirt,这种情况也不会出现。 -
@KonradRudolph:但在 CLR 中仍有可能......
标签: c# .net f# equals equality