Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#运算符的重载运算符&;(左、右)_C#_Operator Overloading - Fatal编程技术网

C#运算符的重载运算符&;(左、右)

C#运算符的重载运算符&;(左、右),c#,operator-overloading,C#,Operator Overloading,我正在研究lazy object composer class Bitset { private List<bool> _data; public Bitset(List<bool> vector) { _data = vector; } public virtual bool GetElement (int i) { return _data[i]; } public Bitset

我正在研究lazy object composer

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

}
但我有一个错误:

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


正如错误所说,您需要确保其中一个参数属于
BitSetComposer

无法执行
(位集a、位集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);
}

如果两个操作数都应为基类类型,则只需将
运算符
代码移到基类即可

发件人:

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

类位集
{ 
私有列表数据;
公共位集(列表向量)
{
_数据=向量;
}
公共虚拟bool GetElement(int i)
{
返回_数据[i];
}
公共位集(){}
公共静态BitsetComposer运算符&(位集a、位集b)
{
返回新的BitsetComposer(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);
}
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);
   }
}