C# 如何正确地重载操作员?

C# 如何正确地重载操作员?,c#,operator-overloading,C#,Operator Overloading,我试图在一个类中重载操作符。但我不能让它工作。 编译器给我发了很多错误。比如: CS0019:运算符“`+”不能应用于“T”和“T”类型的操作数。 或 CS1020:需要可重载的二进制运算符 这是我的代码: //-------------------------------------------------- public class DataObject<T> { private T data; public static void operator =(

我试图在一个类中重载操作符。但我不能让它工作。 编译器给我发了很多错误。比如:

CS0019:运算符“`+”不能应用于“T”和“T”类型的操作数。

CS1020:需要可重载的二进制运算符

这是我的代码:

//-------------------------------------------------- 

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实例是否可以作为整数同时作为对象实例处理。