Как компилятор выбирает метод между 2 с похожей подписью? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 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 ]

0 голосов
/ 21 ноября 2018

Подпись:

public static string GetStringValue<TFrom>(this TFrom enumValue) 

Является общей подписью, что означает, что к ней разрешено обращаться как:

public static string GetStringValue<ContentMIMEType>(this ContentMIMEType enumValue) 

Что более конкретно, чем:

public static string GetStringValue(this Enum @enum)

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

0 голосов
/ 21 ноября 2018

Здесь больше.

Просто с сайта:

Перегрузка - это то, что происходит, когда у вас есть два метода с одинаковым именем, но разными сигнатурами.Во время компиляции компилятор определяет, какой именно он будет вызывать, основываясь на типах времени компиляции аргументов и цели вызова метода.

И когда компилятор не может вывести, что правильно,ошибка возврата компилятора.

РЕДАКТИРОВАТЬ :

На основе Ограничения на параметры типа и Enum Class enum является struct и реализует IConvertible, поэтомусоответствует требованиям и использование компилятора в первую очередь.Нет конфликта с Enum, потому что Enum является любовником структуры в иерархии наследования.

...