搜索" C#语言规范,版本5.0和#34;的各种术语。似乎没有明确声明比较的LHS和RHS必须属于同一类型,或者能够明确转换,或者通过演员可以明确转换。
搜索的单词和短语包括转换,强制转换,隐式,显式,if语句,等等。
直观地说,人们不会将苹果与橙子进行比较;无论如何,令人惊讶的是(对我而言),AFAIK在C#语言规范中没有明确说明。
答案 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#如何定义比较两个对象的很多方法,并且在规范中没有任何地方定义它们应该一致地表现。除此之外,这意味着您可以定义自己的类A
和B
,以便(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"