C#语言规范是否明确声明比较必须是相同的类型?

时间:2015-12-03 18:10:13

标签: c# specifications comparison-operators restrictions

搜索" C#语言规范,版本5.0和#34;的各种术语。似乎没有明确声明比较的LHS和RHS必须属于同一类型,或者能够明确转换,或者通过演员可以明确转换。

搜索的单词和短语包括转换,强制转换,隐式,显式,if语句,等等

直观地说,人们不会将苹果与橙子进行比较;无论如何,令人惊讶的是(对我而言),AFAIK在C#语言规范中没有明确说明。

3 个答案:

答案 0 :(得分:5)

  

C#语言规范是否明确声明比较必须属于同一类型?

没有。比较运算符 - < <= > >= == != - 两侧不需要具有相同类型的操作数。实际上,操作数不需要类型。 foo >= null完全合法,但null没有类型。

  

直观地说,人们不会将苹果与橙子进行比较;无论如何,令人惊讶的是(对我而言),AFAIK在C#语言规范中没有明确说明。

直觉上人们希望能够将整数与短路,短路到小数等进行比较吗?是否期望能够将可为空的int与int进行比较?如果一个经理是一个人,那么能够问这个经理和这个人是否相同是否有意义?&#34;我认为很明显,比较运算符的操作数不需要在编译时或运行时都是相同的类型。

答案 1 :(得分:4)

在找到here的规范中,我在第344页找到了引用

  

二元运算符的签名由运算符令牌(+, - ,*,/,%,&amp;,|,^,&lt;&lt;,&gt;&gt;,==,!=,&gt; ,&lt;,&gt; =或&lt; =)以及两个形式参数的类型。

需要注意的部分是“类型”是多元化的。在C#中,我将二元运算符视为与采用两个参数并返回给定类型值的方法类似。返回类型必须由两个输入参数的类型定义。

更新:

我决定再添加一些,因为我发现它很有趣。在这个Eric Lippert Blog Post中,他说了以下内容。

  

[...]对于一个不一致地实现==Equals的类来说,这是合法且令人惊讶的常见。

他的全部内容基本上是C#如何定义比较两个对象的很多方法,并且在规范中没有任何地方定义它们应该一致地表现。除此之外,这意味着您可以定义自己的类AB,以便(a as A) == (b as B)(a as A) != (b as B)同时评估相同的内容。

这只是在我之前的评论中增加了一点点,二元运算符实际上就像这方面的方法很多。 C#语言没有给出具体的含义,即使我们人们发现这一点令人困惑。

答案 2 :(得分:3)

因为它是有效的比较,所以语言不允许它。在下面的示例中,没有办法也不需要将A转换为B或反之亦然,但比较代码仍然有效。可能逻辑上不合理,但编译方面也是有效的。

class A {
    public int a = 5;

    public static bool operator==(A a, B b) {
        return a.a == b.b;
    }
    public static bool operator!=(A a, B b) {
        return !(a == b);
    }
}
class B {
    public int b = 5;
}
// ...
Console.WriteLine(new A() == new B()); // "true"