首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运算符泛型重载

运算符泛型重载
EN

Stack Overflow用户
提问于 2012-12-24 11:01:46
回答 4查看 18K关注 0票数 15

可能重复: Arithmetic operator overloading for a generic class in C#

下面是我为将复数添加到重载运算符而创建的泛型类的代码。

代码语言:javascript
复制
public class Complex<T>
{
    public T _a, _b;
    public Complex(T i, T j)
    {
        _a = i;
        _b = j;
    }
    public static Complex<T> operator +(Complex<T> i, Complex<T> j)
    {
        return new Complex<T>(i._a + j._a, i._b + j._b);
    }
}

当我处理这件事时,我发现一个错误,

代码语言:javascript
复制
Error: Operator '+' cannot be applied to operands of type 'T' and 'T'

有人能建议我如何使用运算符重载泛型吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-24 11:33:50

问题是编译器无法知道+运算符是否可以应用于T。不幸的是,无法将T限制为C#中的数字类型。

但是,您可能可以使用动态运行时解决这个问题:

代码语言:javascript
复制
public class Complex<T> where T : struct
{
    public T _a, _b;
    public Complex(T i, T j)
    {
        _a = i;
        _b = j;
    }
    public static Complex<T> operator +(Complex<T> i, Complex<T> j)
    {
        return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b));
    }

    private static T Sum(T a, T b)
    {
        return (dynamic)a + (dynamic)b;
    }
}
票数 28
EN

Stack Overflow用户

发布于 2012-12-24 11:36:09

如果您想作弊,可以暂时将它们标记为dynamic类型,并允许运行时决定如何进行。只要您使用的T类型定义了+运算符,它就能工作。这意味着它将同时适用于数字和字符串,或者任何类型(自定义或其他类型);不确定这是否是Complex的目的。此外,如果没有+操作符可供利用,则会在运行时抛出异常;据我所知,没有办法(据我所知)对此进行编译时检查。

代码语言:javascript
复制
public class Complex<T>
{
    public T _a, _b;
    public Complex(T i, T j)
    {
        _a = i;
        _b = j;
    }
    public static Complex<T> operator +(Complex<T> i, Complex<T> j)
    {
        dynamic d_i = i;
        dynamic d_j = j;
        return new Complex<T>(d_i._a + d_j._a, d_i._b + d_j._b);
    }
}

字符串的示例用法:

代码语言:javascript
复制
Complex<string> i = new Complex<string>("Hel", "Wor");
Complex<string> j = new Complex<string>("lo ", "ld!");

Complex<string> ij = i + j;

Console.WriteLine(ij._a + ij._b); //Hello World!
票数 2
EN

Stack Overflow用户

发布于 2012-12-25 04:56:03

如上所述,可以将T约束为IConvertible,然后使用decimal类型执行所需的数学函数,如下所示:

代码语言:javascript
复制
public class Complex<T> where T : struct, IConvertible
{
    public T _a, _b;

    public Complex(T i, T j)
    {
        _a = i;
        _b = j;
    }

    public static Complex<T> operator +(Complex<T> i, Complex<T> j)
    {
        return new Complex<T>(Sum(i._a, j._a), Sum(i._b, j._b));
    }

    private static T Sum(T a, T b)
    {
        return (T)Convert.ChangeType(a.ToDecimal(CultureInfo.CurrentCulture) + b.ToDecimal(CultureInfo.CurrentCulture), typeof(T));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14020486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档