通用扩展方法,运算符

时间:2014-08-18 10:05:41

标签: c# generics

我想制作一个"转换"一个空间到另一个这在C ++模板中非常简单,但在C#中,我不确定哪个接口/类型或我需要如何使用"其中"子句是为了让编译器理解我想要的东西。我的C ++函数看起来像这样:

template<class T>
T Transform(T s, T s1, T s2, T d1, T d2)
{
        T result = (s - s1) / (s2 - s1) * (d2 - d1) + d1;       

        return result;
}   

我第一次尝试使用通用C#版本(在扩展方法中),看起来像这样:

public static T Transform<T>(T s, T s1, T s2, T d1, T d2)
{
        T result = (s - s1) / (s2 - s1) * (d2 - d1) + d1;       

        return result;
}

Alas C#希望我对这些类型更加具体,即

  

&#34;错误CS0019:运营商&#39; - &#39;不能应用于&#39; T&#39;类型的操作数。   和&#39;&#39;&#34;。

C#希望我做什么?

1 个答案:

答案 0 :(得分:3)

您无法通过约束直接告诉编译器T实现了某个运算符。你只能告诉编译器T实现了一些类。如果此类使运算符超载,则可以使用它。

例如,一个定义&#39; - &#39;操作

public class Stuff
{
    public Stuff(int number) {
        Number = number;
    }

    public int Number { get; set; }

    public static Stuff operator -(Stuff a, Stuff b) {
        return new Stuff(a.Number - b.Number);
    }

    //Define the other operators in the same way...
}

然后,在您的方法中,您可以这样做:

public static T Transform<T>(T s, T s1, T s2, T d1, T d2)
    where T : Stuff
{
    Stuff result = (s - s1) / (s2 - s1) * (d2 - d1) + d1;
    return (T)result;
}

或者,您可以使用dynamic,但如果运算符不存在,则会引发异常。