2010-10-14 62 views
2

我對C#很陌生,有兩個關於泛型列表和擴展方法的問題。很抱歉,如果問題是有點笨..通用列表的擴展方法

之間有什麼區別:我曾經想關於這個問題讀了

public static IObjectWithTempID FindByTempID 
    (this ObservableCollection<IObjectWithTempID > list, long tempID) 

public static IObjectWithTempID FindByTempID<E> 
    (this ObservableCollection<IObjectWithTempID> list, long tempID) 

,但還是不理解:$

我遇到了一個奇怪的問題。當我宣佈一個ObservableCollection,比如這個

ObservableCollection<TestObjectWithTempID> a = 
    new ObservableCollection<TestObjectWithTempID>(); 

,可以調用擴展方法

public static long FindByTempID 
    (this IEnumerable<IObjectWithTempID> list, long tempID){} 

名單上。令人驚訝的是,不可能稱爲擴展方法

public static long FindByTempID 
    (this ObservableCollection< IObjectWithTempI D> list, long tempID){} 

雖然。我在這裏錯過了什麼?

+0

無法讀取你的代碼:( – jlafay 2010-10-14 20:27:06

回答

1

關於第一個問題:

在第二種方法聲明中的E FindByTempID<E>type parameter。換句話說,它是一個佔位符,而不是實際的類型。可以在方法體中使用E,就好像它是真實類型一樣。這種編程的總稱是泛型

5

爲2,它需要:

TheMethod<T>(ObservableCollection<T> list) 
    where T : ISomeInterface 

否則,你可以嘗試任何 ISomeInterface實例添加到一個更具體的名單。

0

有了這些擴展方法

public static class Extenders 
{ 
    public static void FindByTempID(this ObservableCollection<IObjectWithTempID> e, long tempID) 
    { 
    } 
    public static void FindByTempID2(this IEnumerable<IObjectWithTempID> e, long tempID) 
    { 
    } 
    public static void FindByTempID3(this ObservableCollection<TestObjectWithTempID> e, long tempID) 
    { 
    } 
    public static void FindByTempID4<T>(this ObservableCollection<T> e, long tempID) 
    { 
    } 
} 

然後

var a1 = new ObservableCollection<TestObjectWithTempID>(); 
var a2 = new ObservableCollection<IObjectWithTempID>(); 

//a1.FindByTempID(1); /* Is not a collection of interface */ 
a1.FindByTempID2(1); // IEnumerable<T> is a generic list 
a1.FindByTempID3(1); // It is a collection of TestObjectWithTempID 
a1.FindByTempID4(1); // Identify the collection as ObservableCollection<TestObjectWithTempID> 

a2.FindByTempID(1); // Is a collection of interface 
a2.FindByTempID2(1); // IEnumerable<T> is a generic list 
//a2.FindByTempID3(1); /* Is not a collection of TestObjectWithTempID */ 
a2.FindByTempID4(1); // Identify the collection as ObservableCollection<IObjectWithTempID> 

IEnumerable<T>