C# 如何正确地重载操作员?
我试图在一个类中重载操作符。但我不能让它工作。 编译器给我发了很多错误。比如: CS0019:运算符“`+”不能应用于“T”和“T”类型的操作数。 或 CS1020:需要可重载的二进制运算符 这是我的代码:C# 如何正确地重载操作员?,c#,operator-overloading,C#,Operator Overloading,我试图在一个类中重载操作符。但我不能让它工作。 编译器给我发了很多错误。比如: CS0019:运算符“`+”不能应用于“T”和“T”类型的操作数。 或 CS1020:需要可重载的二进制运算符 这是我的代码: //-------------------------------------------------- public class DataObject<T> { private T data; public static void operator =(
//--------------------------------------------------
public class DataObject<T>
{
private T data;
public static void operator =(DataObject<T> a, T b)
{
a.data = b;
}
public static DataObject<T> operator +(DataObject<T> a, DataObject<T> b)
{
return a.data + b.data;
}
public static T operator +(DataObject<T> a, T b)
{
return a.data + b;
}
}
//--------------------------------------------------
public class Int : DataObject<int>
{
}
//--------------------------------------------------
public class Calc
{
public Int Add(Int a, Int b)
{
return a + b;
}
public void Add(Int a, Int b, Int result)
{
result = a + b;
}
}
//--------------------------------------------------
public class EntryPoint
{
static void Main()
{
Int a = new Int();
Int b = new Int();
Int result = new Int();
Calc calc = new Calc();
a = 5;
b = 7;
calc.Add(a, b, result);
Console.Write("\n result=" + result);
a = 3;
b = 6;
result = calc.Add(a, b);
Console.Write("\n result=" + result);
}
}
/-------------------------------------------------------------
公共类数据对象
{
私有T数据;
公共静态void运算符=(数据对象a,T b)
{
a、 数据=b;
}
公共静态数据对象运算符+(数据对象a、数据对象b)
{
返回a.data+b.data;
}
公共静态T运算符+(数据对象a,T b)
{
返回a.data+b;
}
}
//--------------------------------------------------
公共类Int:DataObject
{
}
//--------------------------------------------------
公共类计算
{
公共整数相加(整数a、整数b)
{
返回a+b;
}
公共无效添加(整数a、整数b、整数结果)
{
结果=a+b;
}
}
//--------------------------------------------------
公共类入口点
{
静态void Main()
{
Int a=新的Int();
Int b=新的Int();
Int结果=新的Int();
Calc Calc=新的Calc();
a=5;
b=7;
计算添加(a、b、结果);
控制台。写入(“\n result=“+result”);
a=3;
b=6;
结果=计算添加(a,b);
控制台。写入(“\n result=“+result”);
}
}
有人能告诉我如何正确地做到这一点吗
注意:我只需要'T'是“int”或“float”数据类型
谢谢 首先,不能在C#中重载
=
运算符=
根本不是其中之一。如果您希望能够执行以下操作:
a = 5;
b = 7;
public class Calc
{
public Int Add(Int a, Int b) => a + b;
public void Add(Int a, Int b, out Int result)
{
result = a + b;
}
}
Int a = 5;
Int b = 7;
Int result;
Calc calc = new Calc();
calc.Add(a, b, out result);
Console.Write("\n result=" + result);
a = 3;
b = 6;
result = calc.Add(a, b);
Console.Write("\n result=" + result);
最接近的方法是使用隐式转换:
public static implicit operator DataObject<T>(T b)
=> new DataObject<T> { data = b };
...
DataObject<int> a = 5;
DataObject<int> b = 7;
Calc
可以是这样的:
a = 5;
b = 7;
public class Calc
{
public Int Add(Int a, Int b) => a + b;
public void Add(Int a, Int b, out Int result)
{
result = a + b;
}
}
Int a = 5;
Int b = 7;
Int result;
Calc calc = new Calc();
calc.Add(a, b, out result);
Console.Write("\n result=" + result);
a = 3;
b = 6;
result = calc.Add(a, b);
Console.Write("\n result=" + result);
最后,Main
可以是这样的:
a = 5;
b = 7;
public class Calc
{
public Int Add(Int a, Int b) => a + b;
public void Add(Int a, Int b, out Int result)
{
result = a + b;
}
}
Int a = 5;
Int b = 7;
Int result;
Calc calc = new Calc();
calc.Add(a, b, out result);
Console.Write("\n result=" + result);
a = 3;
b = 6;
result = calc.Add(a, b);
Console.Write("\n result=" + result);
这是行不通的,因为
T
可以是任何东西,包括不定义+
运算符的类。您需要在Int
类中定义它,在该类中,您知道类型具有+
运算符。或者,您可以创建一个抽象的Add
方法并调用它,然后强制子类定义如何添加泛型类型。好的,谢谢您的帮助help@juharr抽象Add
方法有点违背了这个目的,不是吗?这样做的目的是不必通过使用泛型类在每个子类中声明运算符。这是一开始的想法。运算符的继承。但现在我知道这是不可能的。Add方法只是一个测试,用于检查Int实例是否可以作为整数同时作为对象实例处理。