Estoy luchando con una resolución de sobrecarga de método extraña, al menos para mí, de .net. He escrito una pequeña muestra para reproducir el problema:Método de resolución de sobrecarga comportamiento inesperado
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
}
imprimirá:
enum overload: 0
object overload: 1
Básicamente, la sobrecarga de llamada es diferente en función del valor (0, 1) en lugar del tipo de datos determinado .
¿Podría alguien explicar?
actualización
debería haber señalado que hay un comportamiento diferente entre C# 2 y C# 3
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
Eso es muy extraño. Hubiera esperado que no compilara en absoluto, porque las dos llamadas separadas a Execute son ambiguas. 0 y 1 son int, por lo que es igualmente válido llamar a la sobrecarga del objeto así como a la sobrecarga de MyEnum. – Nick
no lo sabía. ¿Por qué 0 es implícitamente convertible a cualquier tipo de enumeración? en el ejemplo aquí, 0 no es un valor válido. si algo no tiene sentido para mi línea de pensamiento, eso no necesariamente significa mucho (como se indicó hace 1 minuto);) – hackerhasid
@statichippo: Es útil en algunos casos, como después de realizar operaciones aritméticas en bits en banderas. @Nick: ambos métodos son * aplicables *, pero la conversión de 0 a enum es "mejor que" la conversión de 0 a objeto por las reglas de la especificación C# ... razón por la cual se llama esa sobrecarga. –