簡體   English   中英

通用列表的擴展方法

[英]Extension method on generic list

我對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){} 

雖然。 我在這里錯過了什么?

對於2,它必須為:

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

否則,您可以嘗試將任何 ISomeInterface實例添加到更特定的列表中。

對於第一個問題:

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

具有這些擴展方法

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM