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:二項演算子のパラメーターの1つは、包含型でなければなりません

4

2 に答える 2

1

operator両方のオペランドが基本クラスタイプであることが予想される場合は、コードを基本クラスに移動するだけで済みます。

7.2.2から演算子のオーバーロード:

ユーザー定義の演算子宣言では、常に、パラメーターの少なくとも1つが、演算子宣言を含むクラスまたは構造体タイプである必要があります。したがって、ユーザー定義の演算子が事前定義された演算子と同じ署名を持つことはできません。

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エラーが示すように、パラメーターの 1 つがクラスのものであることを確認する必要があります。

できない理由は(BitSet a, BitSet b)、カスタム クラスへの参照がないためです。次の例を検討してください。

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

BitsetComposerこの例では、 's 演算子が使用されることを期待する理由はありませんよね? &そのため、対応する型の少なくとも 1 つを使用せずに演算子をオーバーロードしようとすると、コンパイラは文句を言います。

したがって、合計 3 つのメソッドを作成する必要があります。

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 に答える