假设它是有效的,所以可以这样写
a = b = c = 2;它也会很好,而不是
bool allTwo = a == 2 && b == 2 && c == 2;改为写
bool allTwo = a == b == c == 2;但我不能,因为== b的计算结果是布尔值,而布尔值不能与整数进行比较。
有没有语言设计的原因,它是这样实现的?
发布于 2010-06-09 23:40:45
表达式a == b的类型是boolean,因此您要么必须打破表达式的含义与上下文相同的规则,要么使用n元==运算符,以便将a == b == c解析为(== a b c)而不是(== (== a b) c)。这意味着您需要使用(a == b) == c将布尔值c与(a == b)的结果进行比较,这是可以的,但不是C#传统中的简单C风格的语法。
发布于 2010-06-09 23:33:46
那么,表达式c == 2将返回true,因此将b与true而不是2进行比较。
编辑:它很可能是这样实现的,因为这就是C风格的语言处理布尔表达式的方式。他们必须为多个术语创建一个特殊的异常,并以不同的方式实现它,而使用赋值运算符则更简单:最右侧的表达式计算为一个值,该值可以逻辑上应用于链中的下一个表达式。看起来设计师采用了简单的方法。
发布于 2010-06-10 01:30:04
从我的角度来看,这是一个清晰的问题。如果由我决定,我会考虑添加这样的语言功能可能会增加太多关于如何计算复杂表达式的歧义。A == b == c和(a == b) == c在某些情况下是不同的吗?如果我真的想将c与== b的布尔结果进行比较,而不是将c与b进行比较,该怎么办?在大多数情况下,编译器可能会找出正确的比较,但如果c是隐式转换为bool的,尽管可能性不大,那么可能无法判断。
因此,就我个人而言,我不确定是否值得这么麻烦。虽然它在语法上可能看起来不是很好,但您可以构建自己的实用函数来比较多个对象的相等性,如下所示:
public static bool Equals(this object x, params object[] y)
{
for (int i = 0; i < y.Length; i++)
{
if (!object.Equals(x, y[i]))
return false;
}
return true;
}然后你可以像这样使用它:
if (a.Equals(b, c, d, e, f, g))
{
// ...
}https://stackoverflow.com/questions/3007288
复制相似问题