2014-02-28 60 views
2

下面的代碼不如何在我自己的泛型方法中使用Math.Abs​​?

編譯......不能轉換噸至INT唧唧歪歪

bool IsEqual<T>(this T a, T b, T offset) 
{ 
    a = Math.Abs(a); 
    b = Math.Abs(b); 
    if (Math.Abs(a - b) < offset) 
     return true; 
    else 
     return false; 
} 

如何使用Math.Abs我自己的泛型方法裏面?

+0

這不起作用? – ReeCube

+3

你不能。您需要爲Math.Abs​​實際支持的類型(或您想要使用的類型的較小子集)提供一組重載代碼和一些非常重複的代碼。 –

+0

@ReeCube不,它不會 –

回答

1

如果只淨有接口的Java,你很可能已經把類似

// Doesn't compile; just the idea 
bool IsEqual<T>(this T a, T b, T offset) 
    where T: Number { // <- T can be any integer or floating point type 
    a = Math.Abs(a); 
    .... 

不幸的是,淨不提供這樣的界面,所以你必須實現超載版本IsEqual

bool IsEqual(this Double a, Double b, Double offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this Single a, Single b, Single offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this long a, long b, long offset) { 
    return (Math.Abs(a - b) < offset); 
    } 

    bool IsEqual(this int a, int b, int offset) { 
    return (Math.Abs(a - b) < offset); 
    } 
    ... 
1

你不能。在你的方法中,類型參數T可以是任何東西,一個字符串,一個類,你可以命名它。

Math.Abs僅適用於一小組參數類型。如果你可以限制T給他們,這將是很好的,但這也是不可能的。

這意味着如果你需要的IsEqual方法與不同類型的T工作,你將不得不手動編寫重載他們:

bool IsEquals(int a, int b, int offset) { } 
bool IsEquals(double a, double b, double offset) { } 
// and many more 
+0

我們能在這裏使用擴展方法嗎? –

+0

你當然可以讓它們成爲擴展方法,但這並不能解決問題。 – Dirk

+0

@TheLastError問題是,無論您使用擴展方法,您都必須將T約束到某個值,否則Math.Abs​​(a)將不會編譯,但是這種約束根本無法實現,因爲C#規範不允許它。該約束還必須包括'T'上存在'operator -'。 – Dirk

相關問題