Метод расширения в общем списке - PullRequest
2 голосов
/ 15 октября 2010

Я довольно новичок в 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){} 

.Что я здесь пропустил?

Ответы [ 3 ]

5 голосов
/ 15 октября 2010

Для 2 должно быть:

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

В противном случае вы можете попытаться добавить любой экземпляр ISomeInterface в более конкретный список.

1 голос
/ 15 октября 2010

По первому вопросу:

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

0 голосов
/ 15 октября 2010

Имея эти методы расширения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...