C# 如何在C语言中的运算符重载中调用False方法#
下面给出了我在C#中为True和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
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)