首页 新闻 会员 周边

false和true重载出现了问题?

0
悬赏园豆:15 [已解决问题] 解决于 2010-03-10 17:39

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呀?
  请详细回答!!!!!!!

shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-03-08 22:17
< >
分享
最佳答案
1

根据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必须成对出现。

收获园豆:15
麒麟.NET | 老鸟四级 |园豆:3614 | 2010-03-08 23:23
@麒麟.NET, @Mingle: 感谢您们二位的解答,通过您们的讲解我进行了测试. 果真是像您们说的那样,"对于需要逻辑表达式的语句,执行的都是operator true; 而只有在进行短路条件逻辑运算时才会调用operator false运算符." 我会关注二位的!!!
shuzhiguolu | 园豆:32 (初学一级) | 2010-03-10 17:39
其他回答(1)
0

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

风影极光 | 园豆:1573 (小虾三级) | 2010-03-09 08:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册