Recentemente ho scritto questo e sono rimasto sorpreso che si compila:Generics in C# con più tipi generici porta a permesso e consentiti ambiguità
public class MyGeneric<U, V> {
MyGeneric(U u) { ... }
MyGeneric(V v) { ... }
public void Add(U u, V v) { ... }
public void Add(V v, U u) { ... }
}
Se io uso questa classe come segue, ottengo un "riferimento costruttore ambiguo" e una "invocazione ambigua" se chiamo Aggiungi.
var myVar = new MyGeneric<int, int>(new MyIntComparer());
Ovviamente, non c'è ambiguità quando uso int e doppia come tipi generici, tranne ovviamente quando uso sia interi, che sarebbe anche assegnare sia in doppio.
var myVar = new MyGeneric<int, double>(new MyIntComparer());
myVar.Add(3, 5);
Quindi ho pensato che fosse permesso anche il seguente, ma sorprendentemente ho ricevuto un errore. Perché non è consentito compilare il seguente?
public interface IMyInterface<T, S> {
void Add(T t, S s);
}
public class MyGeneric<U, V> : IMyInterface<U, V>, IMyInterface<V, U> {
public MyGeneric(U u) { }
public MyGeneric(V v) { }
void IMyInterface<U, V>.Add(U u, V v) { ... }
void IMyInterface<V, U>.Add(V v, U u) { ... }
}
Indipendentemente se uso implementazione dell'interfaccia implicita o esplicita, il compilatore rileva che
'MyGeneric < U, V >' non può attuare sia IMyInterface 'IMyInterface < U, V >' e' < V, U > 'perché possono unificare per alcune sostituzioni dei parametri di tipo
E perché è il primo allo vuoi scrivere?
Sebbene [questi] (http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspx) [due] (http: // blogs.msdn.com/b/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx) i post del blog parlano del caso in cui un metodo generico e un metodo non generico potrebbero finire con la stessa firma per determinati argomenti di tipo, potrebbero anche applicarsi al caso dell'argomento a due tipi. (La risposta data al motivo per cui questo è permesso è essenzialmente "Lo abbiamo permesso in C# 2.0 ed è troppo tardi per cambiarlo ora") – Rawling
Grazie per questi collegamenti, è la spiegazione dell'implementazione del compilatore che stavo cercando – AlexH
@Rawling, grazie per il link interessante – Andreas