0

我正在研究惰性对象作曲家

class Bitset
{ 
   private   List<bool> _data;   
   public Bitset(List<bool> vector)
   {
      _data = vector;
   }
   public virtual bool  GetElement (int i)
   {
      return _data[i];
   }


   public Bitset(){}

}
class BitsetComposer:Bitset
{        
   readonly private Bitset _a,_b;
   private Func<bool,bool,bool> _composer;
   public BitsetComposer(Bitset a,Bitset b, Func<bool,bool,bool> composer)
   {
      this._a=a;
      this._b=b;
      this._composer=composer;
   }

   public override bool GetElement (int i)
   {
      return _composer(_a.GetElement(i),_b.GetElement(i));
   }

   public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
   {
      return new BitsetComposer(a,b,BitsetComposer.And);
   }

   public static bool And(bool a,bool b){return a&b;}

}

这不好,因为希望 & 也可以采用基类

//replaced with
//public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
public static BitsetComposer operator & (Bitset a, Bitset b)
{
   return new BitsetComposer(a,b,BitsetComposer.And);
}

但我得到了错误:

错误 CS0563:二元运算符的参数之一必须是包含类型

4

2 回答 2

1

如果预计两个操作数都是基类类型,则只需将operator代码移至基类。

7.2.2 运算符重载

用户定义的运算符声明始终要求至少一个参数是包含运算符声明的类或结构类型。因此,用户定义的运算符不可能与预定义的运算符具有相同的签名。

class Bitset
{ 
   private   List<bool> _data;   
   public Bitset(List<bool> vector)
   {
      _data = vector;
   }
   public virtual bool  GetElement (int i)
   {
      return _data[i];
   }

   public Bitset(){}


   public static BitsetComposer operator &(Bitset a, Bitset b)
   {
       return new BitsetComposer(a, b, BitsetComposer.And);
   }
}
于 2012-11-29T23:40:22.207 回答
0

就像错误所说的那样,您需要确保您的参数之一是BitSetComposer该类的。

您不能这样做的原因(BitSet a, BitSet b)是因为这样就不会引用您的自定义类。考虑这个例子:

var a = new BitSet();
var b = new BitSet();
var result = a&b;

在此示例中,没有理由期望使用BitsetComposer' 运算符,对吗?因此,当您尝试重载&运算符而不使用至少一种相应类型时,编译器会抱怨。

所以你需要做三种方法:

public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
{
   return new BitsetComposer(a,b,BitsetComposer.And);
}
public static BitsetComposer operator & (BitSet a, BitsetComposer b)
{
   return new BitsetComposer(a,b,BitsetComposer.And);
}
public static BitsetComposer operator & (BitsetComposer a, BitSet b)
{
   return new BitsetComposer(a,b,BitsetComposer.And);
}
于 2012-11-29T23:37:40.950 回答