簡體   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