Следующие программные выходы «У нас есть что-то еще». Как правильно определить тип данных передаваемого типа?Определение типов с генериками
ответ
Используйте ключевое слово is
.
if(aType is string)
Console.WriteLine("We have a string");
else
Console.WriteLine("We have something else");
Одна вещь, чтобы обратить внимание при использовании такого рода логики в том, что is
возвращает истину для супер-типов, которые могут привести к неожиданному поведению:
if(myObj is object)
Console.WriteLine("This will always print");
else if(myObj is int)
Console.WriteLine("This will never print");
Это не работает – 2010-11-24 01:40:33
В вашем примере вы передаете `Type` не` string`, поэтому он «не работает». – 2010-11-24 01:41:55
Если вы ищете тип из (небольшого) конечного списка, вы можете использовать 'is'.
typeof(string)
возвращает Type
.
Поэтому компилятор сообщает, что вы намереваетесь позвонить AFunction<Type>(typeof(string))
.
GetType
возвращает Type
, представляющий тип Type
для экземпляра Type
.
typeof(Type)
не равно typeof(string)
, поэтому результат в точности соответствует ожидаемому.
вы имели в виду
AFunction<string>("Hello World");
void AFunction<T>(T value)
{
if (value is string) ...
}
или
AFunction(typeof(string));
void AFunction(Type type)
{
if (type == typeof(string)) ...
}
или
AFunction<string>();
void AFunction<T>()
{
if (typeof(T) == typeof(string)) ...
}
?
Используя текущие вызовы, которые могли бы сделать что-то подобное прекращение функции следующим образом:
void AFunction<T>(T aType)
{
if ((aType as Type).Name == "String")
{
Console.WriteLine("We have a string");
}
else
{
Console.WriteLine("We have something else");
}
}
Я думаю, вам не нужно использовать Generic Type в этом обстоятельстве. Вы просто отправить тип объекта в прекращение функции, а затем использовать is
ключевое слово следующим образом:
void AFunction(Object aType)
{
if (aType is string) {
Console.WriteLine ("We have a string");
} else {
Console.WriteLine ("We have something else");
}
}
Кстати, я думаю, что Родовой тип не для такого использования.
- 1. Использование анонимных генерических типов с несколькими генериками
- 2. Scala: несоответствие типов с вложенными генериками
- 3. Ошибка компилятора «несовместимых типов» с привязкой лямбда/метода и генериками
- 4. Кастинг для менее производных типов и обращения с генериками
- 5. XML-схема: определение типов типов
- 6. Рисунок декоратора с несколькими генериками
- 7. Java: экспериментирование с генериками
- 8. Поле с несколькими генериками
- 9. управление ручками с генериками
- 10. Комбинация функций Scala с генериками
- 11. Определение «типов» объектов
- 12. Basic haskell: Определение типов
- 13. Swagger Определение примитивных типов
- 14. Определение типов данных
- 15. Определение преобразования типов программно
- 16. Определение типов в Haskell
- 17. Проблема с верхними ограниченными генериками
- 18. Ошибка сегментации с быстрыми генериками
- 19. Рекурсивное слияние карт с генериками
- 20. Сопоставление конфигурации Unity с генериками
- 21. Проблема с генериками в Java
- 22. Метод расширения с вложенными генериками
- 23. Неожиданная ошибка связывания с генериками
- 24. Определение типа с переменным списком других типов
- 25. Определение примитивных типов с использованием roslyn
- 26. Определение функции для нескольких типов
- 27. Определение общих типов со строкой
- 28. Индуктивное определение для семейства типов
- 29. Определение типов данных в цикле
- 30. Определение типа быть Superset типов
Что вы пытаетесь выполнить, точно? Вы хотите, чтобы у нас была строка? – strager 2010-11-24 01:44:26