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 […]
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é […]
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. […]
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 = […]
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 […]
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é 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 […]
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 […]
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 […]
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; […]