为了账号安全,请及时绑定邮箱和手机立即绑定

false和true重载出现了问题?

false和true重载出现了问题?

qq_遁去的一_1 2018-12-07 00:56:26
using System; public struct DBBool {   public static readonly True = new DBBool(1);   public static readonly False = new DBBool(-1);   public static readonly Null = new DBBool(0);   private sbyte value;   private DBBool(int val) { value = val; }   public static implicit operator DBBool(bool x)   {       return x ? True : False;   }   public static explicit operator bool(DBBool x)   {       return x.value > 0;   }   public static DBBool operator &(DBBool x , DBBool y)   {       return new DBBool(//...);   }   public static DBBool operator |(DBBool x , DBBool y)   {       return new DBBool(//...);   }   public static bool operator true(DBBool x)   {       return x.value > 0;   }   public static bool operator false(DBBool x)   {       return x.value < 0; //这里出现了问题   }     public static DBBool operator !(DBBool x)     {       return new DBBool(-x.value);     } } public class Test {   static void Main()     {       DBBool blTrue = true;       DBBool blFalse = false;       if(blTrue) //(1)         Console.WriteLine("OK"); //可以执行.       if(blFalse) //(2)         Console.WriteLine("OK");  //为什么这里不能执行?       if(!blFalse) //(3)         Console.WriteLine("OK"); //可以执行.     } } (2)在进行if判断时,本来在底层的false运算符内部原以为可以返回true呢? 但是从实际测试后角度出发,预期效果感觉不是按照定义的那样执行结果! 由于重载了运算符"!",从(3)if判断中又可以正常执行,所以使我更加糊涂了!   在(2)中重载的false运算符执行了吗?那么为什么不能返回true呀?   请详细回答!!!!!!!
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

根据C#语言规范7.20节的描述:对于需要布尔表达式的语句,如if、while、do、for等,都需要布尔表达式的类型重载explicit bool或operator true。也就是说对于这些语句,所执行的都是operator true的重载,因此LZ的(2)执行的是operator true,没有执行operator false。

那么operator false什么时候执行呢?在执行&&操作时,会首先调用operator false来判断是否为false,若是则直接跳出;在执行||操作时,会首先调用operator true来判断是否为true,若是则直接继续执行。LZ可以通过调试来验证这些结论。

此外,operator true和operator false必须成对出现。

查看完整回答
反对 回复 2019-01-21
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

对于需要布尔表达式的语句,如if、while、do、for等,执行的都是operator true的重载

查看完整回答
反对 回复 2019-01-21
  • 2 回答
  • 0 关注
  • 346 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信