Sto combattendo con una strana risoluzione, almeno per me, del metodo .net. Ho scritto un piccolo campione di riprodurre il problema:Comportamento imprevisto di overload del metodo
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
}
stamperà:
enum overload: 0
object overload: 1
Fondamentalmente il sovraccarico di chiamata è diverso a seconda del valore (0, 1) al posto di un dato tipo di dati .
Qualcuno potrebbe spiegare?
Aggiornamento
avrei fatto notare che c'è un diverso comportamento tra C# 2 e C# 3
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
Questo è molto strano. Mi sarei aspettato che non si compilasse affatto, perché le due chiamate separate a Execute sono ambigue. 0 e 1 sono int, quindi è ugualmente valido chiamare sovraccarico di oggetti e sovraccarico di MyEnum. – Nick
non lo sapevo. perché 0 è implicitamente convertibile in qualsiasi tipo di enum? nell'esempio qui, 0 non è un valore valido. se qualcosa non ha senso per la mia linea di pensiero, ciò non significa necessariamente molto (sebbene indicato 1 minuto fa);) – hackerhasid
@statichippo: È utile in alcuni casi, ad esempio dopo aver eseguito l'aritmetica bit per bit su bandiere. @Nick: Entrambi i metodi sono * applicabili *, ma la conversione da 0 a enum è "migliore di" la conversione da 0 a oggetto dalle regole della specifica C# ... che è il motivo per cui viene chiamato quel sovraccarico. –