or-assignment运算符(| =)如何工作? (C#)

时间:2016-04-26 09:28:04

标签: c# refactoring operators assignment-operator compound-assignment

我见过documentation并回答(1) (2)试图解释| =运算符是什么以及它是如何工作的,虽然它在基本级别上有意义......我不明白为什么或如何完成它的工作。

解释说a |= b等同于a = a | b,但我不知道如何评估是否给a自身的价值(a)或b的值。根据我的理解,“或”意味着它可以是两件事之一,但没有具体说明它是哪两件事。

在Visual Studio中,我使用了一个名为Refactoring Essentials的扩展,它建议我用一个带有| =运算符的行替换我的一些代码,虽然代码与运算符在那里工作,但我很遗憾它完成了它,这促使我尝试在线研究它(因此,提出这个问题)。

我的代码来自

if (MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No)
{
    e.Cancel = true;
}

e.Cancel |= MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No;

它仍然有效。虽然我猜测e.Cancel是基于对MessageBox.Show(...) == MessageBoxResult.No的评估而确定的,但我不知道为什么在那里需要| =运算符。为什么不使用标准赋值(=)运算符,因为表达式的结果是布尔值,e.Cancel采用布尔值?那么使用条件(?:)运算符呢?如何| =比较(如果它甚至)?

1 个答案:

答案 0 :(得分:7)

|是BITWISE OR运算符,它不是BOOLEAN OR运算符。

假设您有两个8位二进制数10110100和11000101。

如果你按位OR它们将在输出中为每个位置设置一个1位,其中第一个或第二个输入中设置了一个位,并且0位是其中的10110100 11000101 -------- 11110101 位。设置两个输入位:

x |= y;

这就是它的全部内容。

如您所知,x = x | y;bool完全相同。

要注意的最后一点是1被视为一位数,其中0 = true而| = false,用于{{1}应用于&时的}和bool按位运算。

但请注意,您不能将boolint按位操作混合使用。例如,以下将给出编译错误:

bool t = true;
bool f = false;
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int'

附录:

人们使用&=|=代表bool而不是看起来更合乎逻辑(双关语)&&=||=的原因是后两个运营商实际上并不存在!