Я борюсь со странным, по крайней мере, для меня, разрешения перегрузки метода .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
Да - константу 0 представляет собой неявно Convertible в любой тип Enum. Константу 1 только явно Convertible в тип Enum. Оба неявно связаны с объектом
(через бокс), но преобразование в enum предпочтительнее, где он доступен.
Обратите внимание, что это имеет Ничего , чтобы сделать то, что определяет значения. Преобразование для любого ненулевого значения является явным, соответствует ли он значением в Enum или нет. Это просто особый случай для значения 0, что делает какой-то другой код проще (особенно при работе с флагами). У меня нет спецификации, чтобы найти ссылку, я боюсь.
Бонусная странность: из-за ошибки в компиляторе MS (никогда не быть исправленным - она сломала бы обратная совместимость), это на самом деле различные нулевые константы , а не просто целое число. Таким образом, выполняется (0D)
и выполняют (0 м)
также преобразуют двойное и десятичное значение для Enum. Это не работает для каждый нулевой постоянный - это зависит от точной природы исходного кода. Это все очень странно - следуйте по ссылке, где открывается Эрик ЛППППЕРТ ...
enum только что сопоставлен с INT (по умолчанию). 0 не отображается до вашего Enum, поэтому перегрузка, которая принимает объект, используется. 1 отображает ваш enum, поэтому перегрузка enum используется.
Вы могли бы сделать это:
Execute((object) 1);
для вывода
Объективная перегрузка: 1