2010-10-14 3 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

ответ

1

Для вашего первого вопроса:

Во втором методе декларации Е в FindByTempID<E> является type parameter. Другими словами, это placeholder для типа, а не фактического типа. E может использоваться в теле метода, как если бы он был реальным типом. Общий термин для этого типа программирования - generics.

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>

Смежные вопросы