2013-05-19 1 views
0

Я смотрел на answer stackoverflow, чтобы узнать больше о методах расширения C#. Я не мог понять часть <T> после имени метода. Чтобы быть более точным:Почему <T> помещается после имени метода для некоторых методов расширения в C#

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

Я понимаю T относится общее название для любого класса. Зачем нам нужно <T> после имени метода для этого метода расширения?

+2

Иначе это не будет общий метод расширения. Теперь вы можете использовать его с любым типом. Не 'T' указывает на общий тип, вы также можете назвать его' TheType', если хотите. –

ответ

1

Поскольку метод должен быть общим для работы с экземплярами любого типа, представленного T. <T> просто сообщает компилятору, что этот метод является общим с параметром типа T. Если вы оставите это, компилятор будет обрабатывать T в качестве фактического типа, что, конечно же, для этого не является.

2

T сам по себе не означает, что он общий. Если у вас есть <> после имени, это означает, что оно является общим, с общим параметром, который вы вызываете в этом случае T.

public static bool In<ParameterType>(this ParameterType source, params ParameterType[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 
1

Это позволяет применять этот метод расширения к любому типу, поскольку метод является общим. Но проверка if(null==source) предполагает, что метод будет работать со типами ссылок. На самом деле, вы можете получить NRE, и я предлагаю добавить проверку нулевого параметра списка входящих.

+0

Зачем ему проверять «nulls»? Если список равен нулю, он будет вызывать 'NullReferenceException', что нужно. –

+0

return list.Contains (source); - если список равен нулю, он получит исключение Null Reference (NRE). В методе может возвращаться 'false if list is null – Uzzy

+0

Да, конечно. То же самое происходит всегда, и это желаемое поведение, если кто-то пытается что-то сделать с 'null'. –