2009-05-07 5 views
13

Ci sono alcune domande & risposte su incisione intorno alla limitazione di C# non permettere il metodo di ritorno (e argomento) tipi di essere cambiato per tipi compatibili sulle sostituzioni, ma perché fa questa limitazione esiste, sia nel compilatore C# o nel CLR? Come posso vedere, non c'è nulla che potrebbe rompersi se fosse permessa la co/contro-varianza, quindi qual è il ragionamento che sta dietro?Perché C#/CLR non supporta il metodo override co/controper varianza?

Una domanda simile potrebbe essere chiesto per l'ampliamento parametri di accesso - ad esempio l'override un metodo interno protetto con un metodo pubblico (cosa che supporta Java, IIRC)

+0

Perché il voto per chiudere? –

risposta

-1

Lo fa, non resta che aspettare per VS2010/.Net 4.0.

+0

Tuttavia, questo è solo il caso per le interfacce, non per i tipi di cemento – JaredPar

+0

Ma quale è stato il motivo per cui si è lasciato fuori in primo luogo? Sembra una cosa abbastanza utile da avere, ad esempio per il modello Factory – thecoop

+1

@JaredPar - interfacce + delegati ;-p –

-1

Per espandere la risposta di Joel - il CLR ha supportato la varianza limitata per un lungo periodo, ma il compilatore C# non li usa fino alla 4.0 con i nuovi modificatori "in" e "out" su interfacce e delegati generici. Le ragioni sono complicate e mi troverei in un pasticcio cercando di spiegare, ma non è così semplice come sembra.

Rielaborazione di un metodo "protetto interno" in un metodo "pubblico"; puoi farlo nascondendo il metodo:

public new void Foo(...) { base.Foo(...); } 

(purché gli argomenti ecc. siano tutti anche pubblici) - qualsiasi uso?

+0

Sì, CLR 2 ha supportato la varianza di tipo generico. Ma non supportava la covarianza del tipo di ritorno. –

+0

Il metodo hiding funzionerebbe, ma non si comporterebbe come un metodo virtuale - una chiamata su un'istanza del supertipo non sarebbe stata inviata al pubblico prioritario – thecoop

+0

Infatti; ha delle limitazioni ... e poiché non è possibile eseguire l'override e "nuova" la stessa firma nello stesso tipo, non è possibile raggiungere un virtual corretto a meno che non si introduca un tipo * extra * e una chiamata virtuale extra *. –

3

Eric Lippert ha già risposto in questo modo meglio di quanto potrei.

Partenza sua serie sul Covariance and Contravariance in C#

e

How does C# 4.0 Generic Covariance & Contra-variance Implmeneted?

EDIT: Eric ha sottolineato che lui non parla di tipo di ritorno convariance ma ho deciso di mantenere il collegamento in questa risposta perché è una bella serie di articoli e qualcuno potrebbe trovarlo utile se si guarda su questo argomento.

Questa caratteristica è stata requested e quasi 5 anni fa Microsoft ha risposto con "Grazie per l'accesso questo. Sentiamo questa richiesta molto. Noi prenderemo in considerazione per la prossima release."

E ora cito Jon Skeet perché non sarebbe una risposta corretta su StackOverflow senza una risposta di Jon Skeet. Covariance and void return types

ho il forte sospetto che la risposta sta nella realizzazione del CLR piuttosto che in qualsiasi profondità semantica ragione - il CLR probabilmente ha bisogno di sapere se non ci sara ' essere un valore di ritorno, per fare cose appropriate con lo stack . Anche così, sembra un po 'un peccato, in termini di eleganza . Non posso dire che ho mai sentito la necessità di questo in real la vita, e sarebbe ragionevolmente facile da falsificare (fino a quattro parametri) in .NET 3.5 semplicemente scrivendo un convertitore da Func<X> a Action<X>, Func<X,Y> a Action<X,Y> ecc.Si pecche un po ' però :)

+0

So che l'implmendedted è scritto male. Ma l'ho semplicemente collegato direttamente. –

+5

No, non ho mai risposto a questa domanda. Questi articoli riguardano la varianza di tipo generico. Questa domanda riguarda la covarianza del tipo di ritorno. Nei miei articoli sulla varianza generica, faccio esplicitamente notare che NON sto parlando della varianza del tipo di ritorno. –

+0

doh. La mia mancanza di memoria. Li ho letti mesi fa e non li ho riletti prima di pubblicare questa risposta. :) –

0

Cuciture introducendo covarianza di valore di ritorno non ha svantaggio essenziale come hanno usato Java e C++. Tuttavia, c'è vera confusione introdotta introducendo contro-varianza del parametro formale. Penso che questa risposta https://stackoverflow.com/a/3010614/1443505 in C++ valga anche per C#.

Problemi correlati