泛型扩展方法,运算符
本文关键字:运算符 方法 扩展 泛型 | 更新日期: 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#希望我更具体地说明类型,即
c#想让我做什么?"错误CS0019:操作符'-'不能应用于'T'类型的操作数"answers"T"。
您不能通过约束直接告诉编译器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,但如果操作符不存在,则会抛出异常。