Как компилятор выбирает метод между 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)

И поэтому метод выбран.

Другие вопросы по тегам