Как проверить, является ли MethodInfo.ReturnType типом System.Void?
-
10-07-2019 - |
Вопрос
Используя отражение для получения MethodInfo, я хочу проверить, является ли возвращаемый тип типом System.Void.
Тестирование, если это System.Int32, работает нормально
myMethodInfo.ReturnType == typeof(System.Int32)
но
myMethodInfo.ReturnType == typeof(System.Void)
не компилируется?В настоящее время я проверяю, является ли строковое представление имени «System.Void», что кажется очень неправильным.
Решение
Вы не можете использовать System.Void
напрямую, но может получить к нему доступ, используя typeof(void)
.
Некоторые отмечают(здесь и в комментариях здесь например), что причина этого в том, что Стандарт ECMA 335, Раздел II, раздел 9.4 гласит:
Следующие виды типа нельзя использовать в качестве аргументов в экземплярах (общих типов или методов):
- Типы Byref (например,
System.Generic.Collection.List 1<string&>
является недействительным)- Типы значений, которые содержат поля, которые могут указывать на стек оценки CIL (например,
List<System.RuntimeArgumentHandle>
)- пустота (например,
List<System.Void>
является недействительным)
Другие советы
Когда я создаю это, я получаю ошибку:
System.Void нельзя использовать из C# — используйте typeof(void) для получения объекта типа void.
Кажется, это и есть ответ...