【问题标题】:C# how to overload operator + for universal classC#如何为通用类重载运算符+
【发布时间】:2015-04-03 21:23:03
【问题描述】:
public struct Vector3<T>
{
    private T X { get; set; }
    private T Y { get; set; }
    private T Z { get; set; }

    public Vector3(T x, T y, T z) : this()
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    public static Vector3<T> operator +(Vector3<T> v1, Vector3<T> v2)
    {
        return new Vector3<int>(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
    }
}

给出错误:无法将运算符“+”应用于“T”和“T”类型的操作数。

请帮忙解决。

【问题讨论】:

  • 如果你在谷歌中输入错误信息,我相信你会找到很多答案。
  • 看看你要求它做什么:构造一个可以将 + 应用于任何类型的泛型方法。整数、字符串、GUID、System.Net.WebClient、匿名类、System.Reflection.AmbiguousMatchException ....任何类。这是不可能的。您需要将 T 限制为某个子集接口,以便编译器知道它实现了 + 运算符。
  • stackoverflow.com/questions/32664/… 这里有很多很好的信息(也不包括 Tigran 的 dynamic 建议)。

标签: c# overloading operator-keyword


【解决方案1】:

您可以通过将类的模板私有成员更改为 dynamic 类型来克服该限制风险自负。 示例:

public struct Vector3<T>
{
    private dynamic X { get; set; }
    private dynamic Y { get; set; }
    private dynamic Z { get; set; }
    ...
    ....
}

不幸的是,在C# 中无法将模板参数限制为数值(我想这是您想要实现的目标)。

【讨论】:

  • 是否有可能加入一个额外的重载来连接两个数组? a={1,2} b ={3,4}。那么c=a+b
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多