Overload di metodi generici

I generics sono una delle più apprezzate novità del .NET Framework 2.0 . In sintesi, questa nuova funzionalità, da la possibilità specializzare un tipo sulla base di come esso viene costruito.

Esempio facile facile:

 class MyClass<T>{
     
public void MyMethod(T var){
         
//Implemetazione
     
}
 }

Il problema che mi sono posto oggi è relativo alla possibilità di effettuare overload di metodi Generici.
Altro esempio per comprendere meglio:

 class MyTest<K, V> {
     
public void MyTestA(K a) {
         
//Implementazione del metodo
     
}
 
     
public void MyTestA(V a) {
         
//Implementazione del metodo
     
}
 }

La classe soprariportata accetta 2 type parameters diversi e contiene un metodo MyTestA che usa K, ed un overload che usa V.
Usiamo questa classe:

 MyTest<stringint> test = new MyTest<stringint>();
 test.MyTestA(“Ciao”);
 test.MyTestA(10);

In questo caso, i type parameters sono di tipo diverso (string ed int) rispettivamente associati a K e V. Se compiliamo, non abbiamo nessun problema in quanto, a runtime, la classe MyTest verrà specializzata e verrà richiamato il metodo corretto. Ma come sappiamo, nulla vieta di instanziare MyTest con

MyTest<intint> test2 = new MyTest<intint>();

e quanto cercheremo di fare:

 test2.MyTestA(10);
 test2.MyTestA(20);

il compilatore ci segnalerà giustamente questo errore:

Error 1 The call is ambiguous between the following methods or properties: ‘GenericSamples2.MyTest<K,V>.MyTestA(K)’ and ‘GenericSamples2.MyTest<K,V>.MyTestA(V)’ Y:……GenericSamples2Program.cs 12 13 GenericSamples2

Ambiguità: non sa che metodo deve essere richiamato.
Ora…se questo oggetto ci serve all’interno di una nostra applicazione, potrei pure essere d’accordo ed usarlo. Ma se stiamo scrivendo un componente…a pare limitare i danni usando qualche constraints, dubito che l’overload di un metodo generico possa avere una reale utilità.

Per carità….possibilissimo che mi sbagli (e felice di essere smentito). Al momento resto però dubbioso.
I commenti sono aperti.