请澄清,规范 - 14.9.6引用类型相等运算符

时间:2017-02-13 17:37:19

标签: c# .net

总有一些东西需要学习。 =)

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。

现在确定是否有任何引用类型相等运算符适用 如下:

  1. 如果类型A和B都是null类型,则重载 不执行分辨率,结果是常量为真或 false,如§14.9中所述。
  2. 否则,如果A是null类型,则B1的引用类型相等运算符适用。如果B是类型参数并且在 运行时类型参数是一个不可为空的值类型,结果 操作是错误的。如果B是类型参数并且在运行时 type参数是可空类型或引用类型,结果 好像B类型的操作数被装箱,然后比较为null。
  3. 否则,如果B是null类型,则A1的引用类型相等运算符适用。如果A是类型参数并且在 运行时类型参数是一个不可为空的值类型,结果 操作是错误的。如果A是类型参数并且在运行时 type参数是可空类型或引用类型,结果 就好像A类型的操作数被装箱,然后比较为null。
  4. 否则,如果A或B是一个未知为引用类型的类型参数(第25.7节),则没有引用类型相等 运营商适用。
  5. 否则,如果没有从A0到B0的身份或参考转换(隐式或显式)或没有身份或参考 转换(隐式或显式)从B0到A0,然后没有引用 类型相等运算符适用。
  6. 否则,如果存在从A1到B1的标识或隐式引用转换,则引用类型相等运算符 适用于B1。
  7. 否则,如果存在从B1到A1的隐式引用转换,则A1的引用类型相等运算符适用。
  8. 否则,不适用引用类型相等运算符。
  9. 因此,它会在第一种情况下进行class vs object比较,在第二种情况下进行class 1 vs class 2 -

    为什么这些规则是这样的?只是没有看到潜在的原因。为什么不需要显式演员?有什么影响?

0 个答案:

没有答案