Параметры универсального типа не являются типами?

#c# #generics #types #typeof

#c# #универсальные типы #типы #typeof

Вопрос:

Я нахожу следующее немного запутанным….

 Dictionary<Type, Object> _typeMap;

public void RegisterType<T>(Object o)
{
    _typeMap.Add(typeof(T), o);
}
  

Почему это typeof(T) требуется в Add методе? Разве T параметр типа уже не является Type ? Что это еще такое?

Ответ №1:

T является именем типа и typeof используется для извлечения соответствующего Type объекта.

Параметр универсального типа работает точно так же, как, скажем, любое другое имя типа int . Вы точно не можете сделать typeMap.Add(int, 0); ни того, ни другого.

Комментарии:

1. Спасибо, это имеет смысл. Возможно, MSDN следовало бы ссылаться на них как type name paramaters вместо type paramaters , это избавило бы меня от путаницы.

Ответ №2:

Нет. Add здесь нужен экземпляр Type класса.

Параметры универсального типа не являются экземплярами Type класса.

Ответ №3:

Вам нужно указать typeof(T), потому что T — это определение класса, а тип — это объект, описывающий тип, который для T и для Object и для String… и т.д. и т.п.

typeof возвращает тип определения класса.

Ответ №4:

Это решение кажется мне чем-то вроде «opps». Я полагаю, что результатом этого кода всегда будет попытка добавить запись с ключом «Type» в словарь из-за того, что вы всегда получаете «typeof» типа. Вместо этого я думаю, что вы ищете…

 public void RegisterType<T>(Object o)
{
    _typeMap.Add(T, o);
}
  

Надеюсь, это поможет!

Комментарии:

1. Вы не можете передать «T» в _typeMap. Добавить, потому что «T» не является выражением. Вам нужно выражение типа System. Введите, чтобы передать в Add.