泛型扩展方法,运算符

本文关键字:运算符 方法 扩展 泛型 | 更新日期: 2023-09-27 18:18:22

我想创建一个将一个空间"转换"到另一个空间的方法。这是一个相当简单的事情模板在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;
}

唉,c#希望我更具体地说明类型,即

"错误CS0019:操作符'-'不能应用于'T'类型的操作数"answers"T"。

c#想让我做什么?

泛型扩展方法,运算符

您不能通过约束直接告诉编译器T实现了某个操作符。您只能告诉编译器T实现了某个类。如果该类重载操作符,则可以使用它。

例如,定义了'-'操作符的类

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,但如果操作符不存在,则会抛出异常。