C# #-|及;接线员?

C# #-|及;接线员?,c#,operators,bitwise-operators,logical-operators,C#,Operators,Bitwise Operators,Logical Operators,编辑:我现在的主要问题是为什么这两个操作符需要重载才能使用&&和| |操作符。短路运算符不会获取对象的真值或假值并进行比较吗?在使用&&and | | |运算符时|和&and在哪里使用 我正在阅读C#,这是一本完整的参考书,我对| and&运算符感到非常困惑。我习惯于它们是比较两个整数位的逐位运算符,但它们被解释为原始逻辑运算符,&&和| |是短路版本,当语句肯定是某个值时停止测试值 这是否意味着这两个操作符有多种用途,或者C#确实在幕后进行类型转换 另外,在类上使用&&和| |运算符时,为什么

编辑:我现在的主要问题是为什么这两个操作符需要重载才能使用&&和| |操作符。短路运算符不会获取对象的真值或假值并进行比较吗?在使用&&and | | |运算符时|和&and在哪里使用

我正在阅读C#,这是一本完整的参考书,我对| and&运算符感到非常困惑。我习惯于它们是比较两个整数位的逐位运算符,但它们被解释为原始逻辑运算符,&&和| |是短路版本,当语句肯定是某个值时停止测试值

这是否意味着这两个操作符有多种用途,或者C#确实在幕后进行类型转换


另外,在类上使用&&和| |运算符时,为什么必须重载|和&?为什么不能重载类的true和false值

&
运算符是整数上的位运算和布尔运算上的求积逻辑运算符。
|
&&
运算符是布尔型上的惰性逻辑运算符

另外,在类上使用&&和| |运算符时,为什么必须重载|和&?为什么不能重载类的true和false值

您有一个具有重载true和false运算符的类Foo。您希望Foo上的
&&
操作符获取两个Foo并返回第三个Foo。解释您计划如何仅使用true和false运算符执行此操作

为什么在C#中需要急切的布尔逻辑运算符

如果您想评估两个布尔返回值的副作用,并对其应用逻辑运算


我不明白,使用&&和| |运算符,我希望返回布尔,而不是其他类型

那你就不需要超负荷工作了。只需编写一个从Foo到bool的隐式转换运算符,就可以随心所欲地使用|、|、&和&&了

仅仅因为您不想让&&或| |运算符返回bool以外的内容并不意味着没有人会这样做。假设您希望编写一个三值逻辑运算符而不是Foo,其中的值可以是True、False或两者都不是。您可以在True、False和Nother上定义&和|和&&和|运算符。显然,您不希望操作员返回bool;您希望它们返回True、False或两者都不返回

我不明白的是| and&运算符与&&and |运算符有什么关系

它们是完全相同的运算符。唯一的区别是,如果不需要计算第二个操作数,则惰性操作数不计算第二个操作数

为什么必须重载| and&才能使用| | and&&尽管如此

请参阅前面的问题和答案

|和&运算符采用两个操作数


是的,有。&&和| |操作员也是如此。

我没想到能在网上找到答案,否则我就不会在这里问了,但我确实做到了,以下是我所拥有的:

从中可以看出:
操作x&&y的计算结果为T.false(x)?x:T.&(x,y)

换句话说,它计算x的真或假,如果x为假,则返回x,否则返回
x&y
。这可以解释为什么需要为&&和| | |重载两个|和&运算符,但不能解释为什么不将其计算为:

T.false(x) ? x : T.false(y) ? y : x

如果有人能解释为什么比较y和x,我将不胜感激。

这些运算符在所有语言中几乎相同:
&
|
具有双重含义,因为它们可以是位运算符(取决于它们的用法)或条件运算符(类似于
&&
|
)它们的意思是
其中as
&
相当于'andalso',
|
是'orelse'。这篇文章有一个很好的解释。基本上,它们用于确定如何评估您的条件。C#操作符:@M.Babcock:这是因为VB.NET向后兼容VB 6,后者只有
&
|
,因此将它们用作按位运算符和条件运算符。但它们实际上没有双重含义;它们仍在执行按位运算。@Int3ὰ: 因为好的答案不能产生好的问题?这就是为什么问题和答案有单独的投票计数。为什么我们在C#中需要热切的布尔逻辑运算符?从未在C#中使用过这些运算符,并且可能会导致微妙的缺陷。我不明白,使用&&和| |运算符,我希望返回布尔,而不是另一个对象…+1来指出一个对象在将VB.NET/VB6代码移植到C#时,我学到的第一件事是,&&和| |运算符与布尔之外的任何东西有什么关系?@CodeInChaos:或者,你可以说可为null的bool只意味着“如果任一操作数为null,则结果为null”。在这种情况下,如果A()为null,那么显然我们不需要计算B()--我们知道结果将为null。但是现在如果A()为false该怎么办?现在我们需要计算B()以知道它是否为null,甚至当A()为false时,这似乎会导致问题,因为代码作者假设B()只有在A()为是真的。简言之,这是一个巨大的混乱,最好的办法是完全避免使用该功能。正如Eric Lippert在回答中提到的,有时
&
不应该返回
bool
。例如,在数据库中找到的三元逻辑“是/否”列:
DBFalse&&x
可以返回false,但是
DBTrue&&DBNull
必须返回
DBNull
。或者在使用
不安全的情况下