C# 如何在C语言中的运算符重载中调用False方法#

C# 如何在C语言中的运算符重载中调用False方法#,c#,C#,下面给出了我在C#中为True和false重载运算符的代码: class LimitedInt { public static bool operator true(LimitedInt x) { if (x.theValue > 10) return true; else return false; } public static bool operator false(Lim

下面给出了我在C#中为True和false重载运算符的代码:

class LimitedInt
{
    public static bool operator true(LimitedInt x)
    {
        if (x.theValue > 10)
            return true;
        else
            return false;
    }
    public static bool operator false(LimitedInt x)
    {
        if (x.theValue < 10)
            return false;
        else
            return true;
    }
    public int theValue;
}
对于代码“else if(!a)”的最后一行,我得到了错误:

接线员‘!’无法应用于“LimitedInt”类型的操作数

我的问题是如何调用False方法

更新:我可以按照这里的人的建议调用假重载。 首先,我必须添加&:

public static LimitedInt operator &(LimitedInt t, LimitedInt s) { return t;}
然后,要调用false重载,请执行以下操作:

if (li1 && li1)
{
}

希望这对其他人也有帮助。

操作员!不调用真/假运算符(
if
,二进制运算符为
&&
|
do。更准确地说,|使用真和&使用假,这是由于基本的“短路”原理)。运算符重载的事实并不意味着
LimitedInt
的类型会突然变为bool

在您提供的示例中,您可以避免一元数!,向类中添加&运算符的重载并写入:

if (li1)
    Console.WriteLine("True Called");
else if((li1 && li1) == false)
    Console.WriteLine ("False Called");
在else if中,第一个
li1
强制计算LimitedInt的false运算符,然后跳过对第二个操作数的计算并产生false,我们需要将其反转以获得控制台输出。你可以看到这有多难看,所以这只是为了演示的目的,而不是我想打扰评论家和其他开发人员的东西

这里已经有三个非常好的答案,加在一起可以更好地解释这一点:



我建议在以下情况下使用隐式运算符:

 class LimitedInt {
   public int theValue;

   // Let's combine both true and false cases into bool and
   // make it implict to allow .Net implictly cast LimitedInt to bool before !:  
   public static implicit operator bool(LimitedInt value) {
     //DONE: validate public methods' arguments
     if (null == value)
       return false; //TODO: put the right value here (true or false)

     return value.theValue > 10;
   }
 }
为了应用
我们允许.Net隐式地将
LimitedInt
转换为
bool

 LimitedInt li1 = new LimitedInt();

 if (!l1i) {
   ...
 }

首先,对于
运算符true
运算符false
来说,这是一个非常糟糕的用例。定义这些操作符的合法用法很少,这不是其中之一

最好定义一个返回bool的“is-valid”方法或属性

通过确保有限的int在构造时处于有效状态,您的情况会更好

最后,有限int是结构的一个很好的候选者,因为它在逻辑上是一个不可变的值

要回答您提出的实际问题,请执行以下操作:

我的问题是如何调用False方法

正如您所注意到的,
运算符不调用
运算符false
。它调用操作符
,但没有一个。C#中调用
运算符false的唯一操作是
&

x && y
逻辑上与

operator_false(x) ? x : (x & y)
显然,除了评估
x
的副作用只发生一次之外

同样地

x || y


如注释中所述,必须在您的类型上定义
|
&
运算符,才能使其工作

我看不出
a
是在哪里定义的。还有,你为什么要这样做?什么是
a
??很抱歉,它是li1,我已经更正了这个问题。因此,如果
大于10,那么
true()
false()
都返回true?@miliesmith“what is truth?”你不也需要重载操作符
(除了
之外)使
|
工作(同样地使用
&
&
)?@Kyle:没错;谢谢你注意到这一点。现在我有一个问题,如何在我的代码中应用x | | | y来调用假重载,你能给我一个具体的代码吗?@yogihosting:定义
&
操作符,然后将
&
|
两个类型的操作符组合在一起。但是你不应该在第一个pla中这样做这是对这些运算符的拙劣使用;您能解释一下为什么要使用它们吗?我通过输入您的代码进行了检查-else if(false | | li1)。现在我得到了错误-运算符“| |”不能应用于“bool”和“LimitedInt”类型的操作数@yogihosting:这是正确的。如果你想将类型的实例视为bool,那么实现运算符true和false是完全错误的。你似乎执意追求一个非常错误的问题解决方案,并且没有解释我ng告诉我们为什么您认为这样做是正确的。对……操作员&也需要过载才能正常工作。对此,我很抱歉,我将信息编辑到了答案中。我假设您正在进行实验,希望看到您期望的结果,但我要补充一点@Eric指出,这将是您同事的维护噩梦开发人员,以防您将此应用于实际项目。@EricLippert谢谢you@dlatikay谢谢。在你的帮助下,我可以调用False重载。我做了两件事。1)添加了&重载2),然后调用False,如果(li1&&li1)。
x || y
operator_true(x) ? x : (x | y)