#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.