2012-03-11 4 views
4

В чем разница между этими сигнатурами метода?Что такое «где T: класс» в общих методах C#?

public void T MyMethod<T>(T parameter) 

и

public void T MyMethod<T>(T parameter) where T : class 

Они, кажется, имеют один и тот же результат ... так что же where T : class делать?

+3

Что неясно [Документы] (http://msdn.microsoft.com/en-us/library/d5x73970 .aspx)? –

ответ

8

Во втором методе T может быть только классом и не может быть типом структуры.

См Constraints on Type Parameters (C# Programming Guide):

где Т: класс

Тип аргумент должен быть ссылкой [класс] тип; это относится также к любому типу класса, интерфейса, делегата или массива.

1

нет разницы, но T ограничен ссылочным типом. они различаются только в compiletime, так как компилятор проверяет, имеет ли тип T ref-type или нет.

+0

Итак, там * есть * разница ;-) Интересно, если они излучают один и тот же ИЛ (например, эта информация хранится?) –

+0

mhmm interesting ... –

4

в первом вы можете вызвать его с не типом реф, например

MyMethod<int>(10); 

, что не будет работать со второй версией, как она принимает только типы реф!

+1

+1 Для практического примера. –

1
  1. Оба не будут скомпилированы. Вы должны использовать либо void, либо T.
  2. И второй метод не будет работать для MyMethod(1), поскольку он требует ссылочного типа для T