Как компилятор выбирает метод между 2 с похожей подписью?
У меня есть Enum
public enum ContentMIMEType
{
[StringValue("application/vnd.ms-excel")]
Xls,
[StringValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")]
Xlsx
}
В расширениях у меня есть 2 способа получить значение атрибута:
public static string GetStringValue<TFrom>(this TFrom enumValue)
where TFrom : struct, IConvertible
{
...
}
а также
public static string GetStringValue(this Enum @enum)
{
...
}
Эти методы имеют разные сигнатуры, но при выполнении следующей операции ContentMIMEType.Xlsx.GetStringValue()
1-й метод принят.
Почему это происходит, потому что выполнение 2-го метода для меня более очевидно (пытался изменить порядок сортировки, но не помогло).
2 ответа
Здесь больше
Просто с сайта:
Перегрузка - это то, что происходит, когда у вас есть два метода с одинаковым именем, но разными сигнатурами. Во время компиляции компилятор определяет, какой именно он будет вызывать, основываясь на типах аргументов времени компиляции и цели вызова метода.
И когда компилятор не может вывести, что является правильным, ошибка возврата компилятора.
РЕДАКТИРОВАТЬ:
Основанный на Ограничениях на параметрах типа и перечислении Enum Class является структурой и реализацией IConvertible
поэтому отвечает требованиям и использование компилятора в первую очередь соответствует. Нет конфликта с Enum, потому что Enum - это больше, чем структура в иерархии наследования.
Подпись:
public static string GetStringValue<TFrom>(this TFrom enumValue)
Является общей подписью, что означает, что она может рассматриваться как:
public static string GetStringValue<ContentMIMEType>(this ContentMIMEType enumValue)
Что более конкретно, чем:
public static string GetStringValue(this Enum @enum)
И поэтому метод выбран.