或赋值运算符 (|=) 如何工作? (C#)

How does the or-assignment operator (|=) work? (C#)

我看到 documentation and answers (1) (2) 试图解释 |= 运算符是什么以及它是如何工作的,虽然它在基本层面上有点道理......我不太明白为什么或者它是如何完成它的工作的。

解释说a |= b等价于a = a | b,但我不明白它如何评估是否给a本身的价值(a ) 或 b 的值。根据我的理解,"or" 意味着它 可以是 两个事物之一,但没有指定它是两个事物中的哪一个。

在 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 接受一个布尔值?那么使用条件 (? :) 运算符呢? |= 与那个相比如何(如果有的话)?

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

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

如果你对它们进行按位或操作,你会在第一个或第二个输入中设置位的每个位置的输出中设置一个 1 位,并且在 NEITHER 中设置一个 0 位设置了两个输入位中的一个:

10110100 
11000101
--------
11110101

仅此而已。

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

最后要注意的一点是 bool 被视为一个一位数字,其中 1 = true 且 0 = false,为了 |& 应用于 bool.

的按位运算

但是请注意,您不能混合使用 boolint 位运算。例如,下面会给出一个编译错误:

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

附录:

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