我想制作一个"转换"一个空间到另一个这在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#希望我做什么?
答案 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,但如果运算符不存在,则会引发异常。