Разрешение перегрузки метода неожиданное поведение

Я борюсь со странным, по крайней мере, для меня, разрешения перегрузки метода .NET. Я записал небольшую выборку для репродуцирования проблемы:

class Program
{
    static void Main(string[] args)
    {
        var test = new OverloadTest();
        test.Execute(0);
        test.Execute(1);

        Console.ReadLine();
    }
}

public class OverloadTest
{
    public void Execute(object value)
    {
        Console.WriteLine("object overload: {0}", value);
    }

    public void Execute(MyEnum value)
    {
        Console.WriteLine("enum overload: {0}", value);
    }
}

public enum MyEnum
{ 
    First = 1, Second = 2, Third = 3
}

Распечатает:

enum overload: 0
object overload: 1

В основном названная перегрузка отличается в зависимости от значения (0, 1) вместо типа определенных данных.

Кто-то мог объяснить?

Обновление

Я должен был указать, что существует другое поведение между C# 2 и C# 3

Do((long)0) => object overload //C# 2
Do((long)0) => enum overload   //C# 3 
17
задан iacoware 12 January 2010 в 08:54
поделиться

2 ответа

Да - константу 0 представляет собой неявно Convertible в любой тип Enum. Константу 1 только явно Convertible в тип Enum. Оба неявно связаны с объектом (через бокс), но преобразование в enum предпочтительнее, где он доступен.

Обратите внимание, что это имеет Ничего , чтобы сделать то, что определяет значения. Преобразование для любого ненулевого значения является явным, соответствует ли он значением в Enum или нет. Это просто особый случай для значения 0, что делает какой-то другой код проще (особенно при работе с флагами). У меня нет спецификации, чтобы найти ссылку, я боюсь.

Бонусная странность: из-за ошибки в компиляторе MS (никогда не быть исправленным - она ​​сломала бы обратная совместимость), это на самом деле различные нулевые константы , а не просто целое число. Таким образом, выполняется (0D) и выполняют (0 м) также преобразуют двойное и десятичное значение для Enum. Это не работает для каждый нулевой постоянный - это зависит от точной природы исходного кода. Это все очень странно - следуйте по ссылке, где открывается Эрик ЛППППЕРТ ...

16
ответ дан 30 November 2019 в 14:17
поделиться

enum только что сопоставлен с INT (по умолчанию). 0 не отображается до вашего Enum, поэтому перегрузка, которая принимает объект, используется. 1 отображает ваш enum, поэтому перегрузка enum используется.

Вы могли бы сделать это:

Execute((object) 1);

для вывода

Объективная перегрузка: 1

-1
ответ дан 30 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: