2009-07-08 84 views
1

我試圖創建一個擴展,可以切片任何數組類(因爲在標準庫中奇怪地缺少切片)。例如:C#:擴展中的多個類型參數

public static M Slice<M,T>(this M source, int start, int end) where M : IList<T> 
{ 
    //slice code 
} 

但是,編譯此方法並不重視M型的對象(即使它的錯誤消息,聲稱這是它正在尋找)。它似乎相當依賴於方法本身的類型參數,例如,以某種方式,但我不完全理解事情是如何工作的。

(是的,我們可以很容易地寫,僅僅在名單工作的例子,但我很好奇,如果這甚至有可能。)

回答

3

有編譯器不會對這些情況推斷類型T自動。即使它不是擴展方法,您仍然需要手動指定類型參數。

例如,如果什麼類被聲明爲:

class MyNastyClass : IList<int>, IList<double> { 
} 

什麼,你會期望T是? intdouble?其結果是,你將永遠有具體參數手動調用它:

Slice(myList, 0, 10); // compile-time error, T cannot be inferred. 
Slice<IList<int>, int>(myList, 0, 10); // works. 

的解決方法是刪除類型參數T(這裏沒有必要約束):

public static void Slice<M>(this IList<M> source, int start, int end) 

由請注意,這並不涉及參數的數量。只要編譯器能夠推斷它們(根據C#規範的泛型類型推斷規則),就可以擁有任意數量的類型參數。例如,這種擴展方法可以稱爲不指定類型參數:

public static void SomeMethod<T,U>(this IEnumerable<T> collection, U anotherParameter)