总有一些东西需要学习。 =)
class My
{
}
这是汇编:
void Main()
{
My s = new My();
IList<My> my = null;
Console.WriteLine(my == s);
}
而这不是:
void Main()
{
My s = new My();
List<My> my = null;
Console.WriteLine(my == s);
}
class vs interface
。
的全部差异
以下是spec所说的内容:
运算符返回比较两个引用的结果是否相等或不相等。
确定引用类型相等运算符的适用时间有特殊规则。
对于具有类型A和B的操作数的相等表达式,按如下方式定义A0:
- 如果A是已知为引用类型的类型参数(第25.7节),则让A0成为A的有效基类。
- 否则,如果A是接口类型,委托类型,数组类型,类类型或null类型(第11.2.7节),则让A0与A相同。(我们的情况在两种情况,不是吗?)
- 否则,不适用引用类型相等运算符。
现在按如下方式定义A1:
- 如果A0是接口类型(第一种情况?),委托类型,System.Delegate或字符串,则让A1为对象(但为什么?)。
- 否则,如果A0是数组类型,则让A1为System.Array。
- 否则,A0是null类型或类类型,让A1与A0相同。 (第二种情况?)
以相同方式定义B0和B1。
现在确定是否有任何引用类型相等运算符适用
如下:
- 如果类型A和B都是null类型,则重载
不执行分辨率,结果是常量为真或
false,如§14.9中所述。
- 否则,如果A是null类型,则B1的引用类型相等运算符适用。如果B是类型参数并且在
运行时类型参数是一个不可为空的值类型,结果
操作是错误的。如果B是类型参数并且在运行时
type参数是可空类型或引用类型,结果
好像B类型的操作数被装箱,然后比较为null。
- 否则,如果B是null类型,则A1的引用类型相等运算符适用。如果A是类型参数并且在
运行时类型参数是一个不可为空的值类型,结果
操作是错误的。如果A是类型参数并且在运行时
type参数是可空类型或引用类型,结果
就好像A类型的操作数被装箱,然后比较为null。
- 否则,如果A或B是一个未知为引用类型的类型参数(第25.7节),则没有引用类型相等
运营商适用。
- 否则,如果没有从A0到B0的身份或参考转换(隐式或显式)或没有身份或参考
转换(隐式或显式)从B0到A0,然后没有引用
类型相等运算符适用。
- 否则,如果存在从A1到B1的标识或隐式引用转换,则引用类型相等运算符
适用于B1。
- 否则,如果存在从B1到A1的隐式引用转换,则A1的引用类型相等运算符适用。
- 否则,不适用引用类型相等运算符。
醇>
因此,它会在第一种情况下进行class vs object
比较,在第二种情况下进行class 1 vs class 2
-
为什么这些规则是这样的?只是没有看到潜在的原因。为什么不需要显式演员?有什么影响?