Articles of covarianza

Perché C # / CLR non supporta il metodo override co / controper varianza?

Ci sono alcune domande e risposte sull’hacking intorno alla limitazione di C # che non consente che i tipi di ritorno (e di argomento) del metodo vengano modificati in tipi compatibili sulle sostituzioni, ma perché esiste questa limitazione, nel compilatore C # o nel CLR? Come posso vedere, non c’è nulla che potrebbe rompersi se […]

Covarianza di Java

Sto attraversando un periodo difficile cercando di capirlo. Dì che ho il seguente codice: class Animal { } class Mammal extends Animal { } class Giraffe extends Mammal { } … public static List getMammals() { return …; } … public static void main(String[] args) { List mammals = getMammals(); // compilation error } Perché […]

ref e out parametri in C # e non può essere contrassegnato come variante

Cosa significa l’affermazione? Da qui ref e out parametri in C # e non può essere contrassegnato come variante. 1) Significa che non è ansible fare quanto segue. public class SomeClass: IVariant { public virtual R DoSomething( ref A args ) { return null; } } 2) O significa che non posso avere il seguente. […]

C # Covariance sui tipi di ritorno sottoclass

Qualcuno sa perché i tipi di ritorno covarianti non sono supportati in C #? Anche quando si tenta di utilizzare un’interfaccia, il compilatore si lamenta che non è consentito. Vedi il seguente esempio. class Order { private Guid? _id; private String _productName; private double _price; protected Order(Guid? id, String productName, double price) { _id = […]

Come posso usare i tipi di ritorno covarianti con puntatori intelligenti?

Ho un codice come questo: class RetInterface {…} class Ret1: public RetInterface {…} class AInterface { public: virtual boost::shared_ptr get_r() const = 0; … }; class A1: public AInterface { public: boost::shared_ptr get_r() const {…} … }; Questo codice non viene compilato. In studio visivo si alza C2555: il tipo di ritorno della funzione virtuale […]

Si tratta di un bug di covarianza in C # 4?

Nella seguente parte di codice mi aspettavo di essere in grado di trasmettere implicitamente da elements a baseElements perché TBase è implicitamente convertibile in IBase . public interface IBase { } public interface IDerived : IBase { } public class VarianceBug { public void Foo() where TBase : IBase { IEnumerable elements = null; IEnumerable […]

Perché non è ansible eseguire il cast di IEnumerable come IEnumerable ?

Perché l’ultima riga non è consentita? IEnumerable doubleenumerable = new List { 1, 2 }; IEnumerable stringenumerable = new List { “a”, “b” }; IEnumerable objects1 = stringenumerable; // OK IEnumerable objects2 = doubleenumerable; // Not allowed Questo perché double è un tipo di valore che non deriva dall’object, quindi la covarianza non funziona? Significa […]

Perché C # (4.0) non consente la co- e controvarianza nei tipi di classi generiche?

Qual è la vera ragione di questa limitazione? È solo un lavoro da fare? Concettualmente è difficile? È imansible? Certo, non si potevano usare i parametri di tipo nei campi, perché sono sempre in lettura e scrittura. Ma quella non può essere la risposta, vero? Il motivo di questa domanda è che sto scrivendo un […]

Spiegazione controvarianza

Prima di tutto, ho letto molte spiegazioni su SO e blog sulla covarianza e la contravarianza e un grande ringraziamento va a Eric Lippert per aver prodotto una così grande serie su Covariance e Contravariance . Comunque ho una domanda più specifica che sto cercando di far girare la testa un po ‘. Per quanto […]

Lista Casting – problema di covarianza / controvarianza

Dati i seguenti tipi: public interface IMyClass { } public class MyClass : IMyClass { } Mi chiedo come posso convertire una List in una List ? Non sono completamente chiaro sugli argomenti di covarianza / contravarianza, ma capisco che non posso semplicemente lanciare l’Elenco a causa di ciò. Potrei trovare solo questa soluzione banale; […]