Dato questo magico interfaccia:In C# 4.0 perché un parametro out in un metodo non può essere covariante?
public interface IHat<out TRabbit>
{
TRabbit Take();
}
E questa gerarchia di classe:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
ora posso compilare questo:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
che è grande. Ma cosa succede se io definisco l'interfaccia in modo diverso:
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
sto indicando che il cappello potrebbe essere vuoto, con un valore di ritorno booleano separato (la versione precedente sarebbe forse tornato un coniglio da un cappello nulla vuoto). Ma sto solo emettendo un coniglio, quindi non sto facendo nulla di logicamente diverso dalla versione precedente.
Il compilatore C# 4.0 nel CTP fornisce un errore nella definizione dell'interfaccia - richiede che i parametri del metodo 'out' siano di tipo invariante. C'è una ragione per cui questo non è permesso o è qualcosa che potrebbe essere risolto in una versione futura?
Per informazioni, ho trovato più blog ecc dicendo lo stesso, ma nessuno dei commenti proviene da fonti MS "ufficiali". Sono abbastanza sicuro che sia corretto, anche se ... la varianza C# 4.0 è ancora basata sulle regole della CLI. –
Sembra abbastanza probabile! –