Подтвердить что ты не робот

Nameof с общими типами

Я пытаюсь получить имя метода на общем интерфейсе. Я ожидаю, что это будет работать, поскольку тип будет действительным типом:

//This does not compile
nameof(IGenericInterface<>.Method)

//This would compile
typeof(IGenericInterface<>)

Я думаю, что это должно быть действительно С# 6, или я что-то упускаю, или это лучший способ сделать это. Я не хочу использовать строку для имени метода, как если бы метод был переименован, код прерывался бы без ошибок времени сборки.

4b9b3361

Ответ 1

Ожидается. Согласно документации, ваше выражение не разрешено, поскольку оно относится к несвязаному родовому типу:

Поскольку аргумент должен быть синтаксическим выражением, существует множество вещей, которые не могут быть перечислены. Следует упомянуть следующие ошибки: предопределенные типы (например, int или void), типы с нулевым значением (Point?), типы массивов (Customer[,]), типы указателей (Buffer*), квалифицированный псевдоним (A::B) и несвязанные общие типы (Dictionary<,>), символы предварительной обработки (DEBUG) и метки (loop:).

Вы можете обойти это ограничение, предоставив общий параметр:

nameof(IGenericInterface<object>.Method)

Примечание. Я думаю, Microsoft должна настроить nameof, чтобы разрешить ссылки на методы несвязанных общих типов.

Ответ 2

Просто используйте тип образца для компиляции.

string name = nameof(IGenericInterface<int>.Method) // will be Method