typeof (T) против <T> - PullRequest
       48

typeof (T) против <T>

6 голосов
/ 01 апреля 2011

В .NET, похоже, есть два способа передачи типа в метод или класс. Первый - через дженерики, в которых мы передаем тип в качестве специального параметра.

Например:

var list = new List<MyClass>();

Другой способ заключается в простоте использования оператора typeof, например:

var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance");

Мой вопрос касается несоответствия в едином интерфейсе методам, которые требуют параметр типа. Почему вышеупомянутое утверждение не может быть сделано следующим образом?

var pe = Expression.ParameterExpression<MyClass>("myinstance");

Это потому, что в поведении компилятора требуются два семантических различия? Когда обобщенный параметр обрабатывается компилятором, он просто выполняет подстановку лямбда-исчисления? В то время как методы стиля typeof требуют фактического экземпляра класса Type для вывода атрибутов и свойств из?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 01 апреля 2011

Первый метод позволяет вам вычислить требуемый тип во время выполнения.

Expression.ParameterExpression(CalculateType(), "myinstance");

Лично я не возражаю против перегрузки, которая определенно сделает код с типом, определенным во время компиляции, намного чище.

3 голосов
/ 01 апреля 2011

Рассмотрим подпись этого метода.

public object MyGetInstanceOfType(Type theType)

Хотя экземпляр соответствующего типа может быть возвращен, компилятор не может проверить его ... theType неизвестен до времени выполнения (задолго до включения компилятора).

Контраст с этим:

public T MyGetInstanceOfType<T>()

Здесь компилятор знает тип каждый раз, когда вызывающая сторона использует этот метод. Он может гарантировать возврат метода, потому что он знает тип всех вызовов.

2 голосов
/ 01 апреля 2011

С var list = new List<MyClass>(); классу List сообщается во время компиляции, что он связан с конкретным типом.Затем компилятор может выполнить проверку типов, чтобы гарантировать, что в список добавляются только элементы MyClass.

При var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance"); выражению сообщается во время выполнения, с каким типом параметра он работает.При таком подходе компилятор не может выполнить строгую проверку типов.Это лучше для динамического кода, когда вещи не могут быть определены во время компиляции, но такие случаи редки (хотя деревья выражений являются одним из них).

0 голосов
/ 01 апреля 2011

Технически, универсальная версия может быть легко создана, так как она может вызвать перегрузку, которая принимает тип, такой как:

public static ParameterExpression Parameter<T>(string name) {
    return Parameter(typeof(T), name);
}

В этом случае, однако, использование универсального не стоит много.Если один из параметров имеет тип T или возвращаемое значение имеет тип T, тогда вы получите строгую типизацию на основе указанного параметра типа.

Добавление общей версии метода Parameter не приводит кэто более или менее строго набрано.

...