Je suis aux prises avec une résolution de surcharge de .net. J'ai écrit un petit échantillon de reproduire le problème:Résolution de surcharge de la méthode comportement inattendu
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
}
imprimera:
enum overload: 0
object overload: 1
Fondamentalement, la surcharge appelée est différente en fonction de la valeur (0, 1) au lieu du type de données .
Quelqu'un pourrait-il expliquer?
Mise à jour
Je aurais dû signaler qu'il ya un comportement différent entre C# 2 et C# 3
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
C'est très étrange. Je m'y attendais à ne pas compiler du tout, car les deux appels séparés à Execute sont ambigus. 0 et 1 sont des int, et il est donc également valable d'appeler la surcharge de l'objet ainsi que la surcharge MyEnum. – Nick
je ne savais pas cela. pourquoi 0 est-il implicitement convertible en un type enum? dans l'exemple ici, 0 n'est pas une valeur valide. si quelque chose n'a pas de sens dans ma ligne de pensée, cela ne signifie pas nécessairement beaucoup (comme indiqué il y a 1 minute);) – hackerhasid
@statichippo: C'est pratique dans quelques cas, comme après avoir effectué l'arithmétique bit à bit drapeaux. @Nick: Les deux méthodes sont * applicables *, mais la conversion de 0 à enum est "meilleure que" la conversion de 0 en objet par les règles de la spécification C# ... ce qui explique pourquoi cette surcharge est appelée. –