Tipi di query in modo co o controvariante

4

Ho postato la richiesta di funzionalità di # ac qui ; tuttavia, non prendo molta attenzione lì. Quindi ti chiedo qui, cosa ne pensi.

Le parole chiave in e out nelle dichiarazioni di tipo generico sono utili; tuttavia, a causa della loro natura, la loro applicazione è limitata a un numero limitato di tipi. Quello che sto suggerendo qui, è di essere in grado di usarli in dichiarazioni di variabili, campi, parametri e possibilmente proprietà al fine di limitare l'insieme di possibili operazioni su qualsiasi tipo generico in modo dinamico e temporaneo. Ciò aumenterebbe considerevolmente i casi in cui potrebbe essere utilizzata la co- e la contravarianza.

Esempi

// A List of a more derived type can be passed
public void ReadList(IList<out MyType> list)
{
    MyType item = list[0];  // OK
    list[0] = new MyType(); // DISALLOWED because of "out" keyword!
    list.Add(new MyType()); // DISALLOWED because of "out" keyword!
}

// A List of a less derived type can be passed
public void WriteList(List<in MyType> list)
{
    MyType item = list[0];  // DISALLOWED because of "in" keyword!
    list[0] = new MyType(); // OK
    list.Add(new MyType()); // OK
}

-

Aggiorna

Preso queste dichiarazioni

class LessDerived { }

class MyType : LessDerived { }

class MoreDerived : MyType { }

Potresti usare i metodi mostrati sopra in questo modo

var listOfLessDerived = new List<LessDerived>();
var listOfMyType = new List<MyType >();
var listOfMoreDerived = new List<MoreDerived>();

ReadList(listOfMyType);
ReadList(listOfMoreDerived);

WriteList(listOfMyType);
WriteList(listOfLessDerived);
    
posta Olivier Jacot-Descombes 27.04.2012 - 18:03
fonte

1 risposta

6

The in and out keywords in generic type declarations are useful; however, due to their nature, their application is limited to a small number of types. What I am suggesting here, is to be able to use them in declarations of variables, fields, parameters and possibly properties in order to restrict the set of possible operations on any generic type in a dynamic and temporary way.

Java ha questa caratteristica. Un dato interessante: la funzione di varianza "call site" in Java e la funzione di varianza "dichiarazione sito" in C # sono state entrambe progettate in gran parte dal mio collega Mads Torgersen.

I am asking you here, what you think of it.

È una funzionalità ragionevole con molti scenari interessanti. Lo abbiamo preso in considerazione e l'abbiamo respinto. I benefici non hanno superato i costi.

    
risposta data 30.04.2012 - 16:42
fonte

Leggi altre domande sui tag