繁体   English   中英

通用扩展方法,运算符

[英]Generic extension method, operators

我想提出一种将一个空间“转换”为另一个空间的方法。 这对于在C ++中进行模板化来说是一件非常简单的事情,但是在C#中,我不确定哪个接口/类型或者我需要如何使用“ where”子句才能使编译器理解我想要的东西。 我的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;
}

las C#希望我更详细地说明类型,即

“错误CS0019:运算符'-'不能应用于类型'T'和'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 ,但是如果运算符不存在,则会抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM