A#运算符的C#重载运算符&(B l,B r)

时间:2012-11-29 23:31:02

标签: c# operator-overloading

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

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;}

}

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

//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:二元运算符的参数之一必须是包含类型

2 个答案:

答案 0 :(得分:1)

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

来自7.2.2 Operator overloading

  

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

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);
   }
}

答案 1 :(得分: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);
}