【问题标题】:Generics and "One of the parameters of a binary operator must be the containing type" Error泛型和“二元运算符的参数之一必须是包含类型”错误
【发布时间】:2011-07-31 19:30:52
【问题描述】:

在声明二元运算符时,至少有一个操作数类型必须是包含类型。总的来说,这听起来是一个不错的设计决策。但是,没想到下面的代码会导致这个错误:

public class Exp<T>
{
    public static Exp<int> operator +(Exp<int> first, Exp<int> second)
    {
        return null;
    }
}

这个运算符有什么问题?为什么这种情况属于c#的运算符重载限制?允许这种声明有危险吗?

【问题讨论】:

    标签: c# operators operator-overloading


    【解决方案1】:

    因为包含类型是Exp&lt;T&gt;,而不是Exp&lt;int&gt;。您在这里尝试做的是专业化a la C++,这在 C# 中是不可能的。

    【讨论】:

    • 所以这里的问题不是操作数与包含类型无关,这可能很危险,而是不允许有“专业化”?
    • 是的。您正在尝试做的事情看起来完全像 C++ 模板专业化,这在 C# 中是无法直接实现的。看看this
    【解决方案2】:

    你在一个Exp&lt;T&gt;类型的类中,并且运算符中的参数都不是Exp&lt;T&gt;,它们都是Exp&lt;int&gt;

    阅读this article 了解解决此问题的建议方法。

    【讨论】:

    • 我知道类型不同。如果它们不相关,我知道这可能很危险。但在这里,它看起来更像是泛型施加的限制,而不是设计保障。感谢您推荐的文章!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2011-02-03
    • 2020-03-06
    • 2014-06-13
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多