C#运算符的重载运算符&;(左、右)
我正在研究lazy object composerC#运算符的重载运算符&;(左、右),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
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);
}
}