Niedawno napisałem to i był zaskoczony, że kompiluje:rodzajowych w C# z wielu typów generycznych prowadzi do dozwolone i niedozwolone dwuznaczności
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) { ... }
}
Gdybym użyć tej klasy w następujący sposób, otrzymuję „niejednoznaczne odniesienie konstruktora” i "niejednoznaczne wywołanie", jeśli zadzwonię do Add.
var myVar = new MyGeneric<int, int>(new MyIntComparer());
Oczywiście, nie ma niejednoznaczność, gdy używam int i double jako typów generycznych, z wyjątkiem oczywiście kiedy używać zarówno ints, które również obie wyznaczać podwójne.
var myVar = new MyGeneric<int, double>(new MyIntComparer());
myVar.Add(3, 5);
Tak więc pomyślałem, że następujące dopuszczenie było dozwolone, ale zaskakująco dostałem błąd. Dlaczego nie można skompilować poniższych elementów?
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) { ... }
}
Niezależnie czy używam bezpośrednia lub pośrednia implementację interfejsu, kompilator stwierdza, że
'MyGeneric < U, V >' nie może realizować zarówno 'IMyInterface < U, V >' i „IMyInterface < V, U > 'ponieważ mogą ujednolicić niektóre podstawienia parametrów pewnego typu
I dlaczego jest pierwszym allo czy chcesz napisać?
Chociaż [to], (http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspx) [dwóch] (http: // blogs.msdn.com/b/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx) blogach mówimy o przypadku gdzie może skończyć ogólny sposób i metoda nierodzajową z tą samą sygnaturą dla niektórych argumentów typu, mogą one również mieć zastosowanie w przypadku argumentów dwóch typów. (Odpowiedź udzielona, dlaczego jest to dozwolone jest w istocie „Pozwoliliśmy go w C# 2.0 i jest to zbyt późno, aby zmienić go teraz”). – Rawling
Dzięki za te linki, to realizacja wyjaśnienie kompilator za Szukałem – AlexH
@Rawling, dzięki za interesujący link. – Andreas