Lingua C #: generici, aperti / chiusi, associati / non associati, costruiti

Sto leggendo il libro “the C # programming Language”, 4th Edition, di Anders Hejlsberg ecc.

Ci sono diverse definizioni che sono un po ‘tortuose:

Tipo generico non associato : una dichiarazione di tipo generico, di per sé, denota un tipo generico non associato …

tipo costruito : un tipo che include almeno un argomento di tipo è chiamato un tipo costruito.

tipo aperto : un tipo aperto è un tipo che coinvolge i parametri del tipo.

tipo chiuso : un tipo chiuso è un tipo che non è un tipo aperto.

tipo non associato: si riferisce a un tipo non generico oa un tipo generico non associato.

tipo legato : si riferisce a un tipo non generico oa un tipo costruito. [annotate] ERIC LIPPERT: Sì, i tipi non generici sono considerati sia vincolati che non associati.

Domanda 1 , è sotto quello che ho elencato correttamente?

int //non-generic, closed, unbound & bound, class A //generic, open, unbound, class A //generic, open, bound, constructed class A //generic, open, bound, constructed class A //generic, closed, bound, constructed 

Domanda 2 , I libri dice “Un tipo non associato si riferisce all’entity framework dichiarata da una dichiarazione di tipo Un tipo generico non associato non è di per sé un tipo, e non può essere usato come tipo di una variabile, argomento o valore di ritorno, o come un tipo di base. L’unico costrutto in cui un tipo generico non associato può essere referenziato è il tipo di espressione (§7.6.11). ” Bene, ma sotto c’è un piccolo programma di test che può compilare:

 public class A { } // Q2.1: how come unbounded generic type A can be used as a base type? public class B : A { } public class C { // Q2.2: how come unbounded generic type Dictionary can be used as a return value? public Dictionary ReturnDictionary() { return new Dictionary(); } // Q2.3: how come unbounded generic type A can be used as a return value? public A ReturnB() { return new A(); } } 

Questi sono esempi di tipi generici non associati :

  • List<>
  • Dictionary< ,>

Possono essere usati con typeof , cioè, le seguenti sono espressioni valide:

  • typeof(List<>)
  • typeof(Dictionary< ,>)

Questo dovrebbe rispondere alla tua domanda 2. Rispetto alla domanda 1, nota che gli argomenti di tipo possono essere tipi costruttivi o parametri di tipo . Pertanto, l’elenco dovrebbe essere aggiornato come segue:

 public class MyClass { // declares the type parameters T and U // all of these are // - generic, // - constructed (since two type arguments are supplied), and // - bound (since they are constructed): private Dictionary var1; // open (since T and U are type parameters) private Dictionary var2; // open (since T is a type parameter) private Dictionary var3; // closed } 

Una risposta eccellente è data da Jon, qui.

Non dare una descrizione tecnica poiché tutto è perfettamente nella risposta collegata. Per replicare semplicemente il suo significato come una risposta qui, sembrerebbe:

 A //non generic, bound A //generic, bound, open, constructed A //generic, bound, open, constructed A //generic, bound, closed, constructed A< ,> (used like typeof(A< ,>)) //generic, unbound 

Modificato dopo discussione con Heinzi.