Perché il nuovo () vincolo deve essere specificato per ultimo?

Il compilatore C # richiede che il nuovo () vincolo sia specificato per ultimo. Secondo MSDN:

Se utilizzato insieme ad altri vincoli, il nuovo vincolo () deve essere specificato per ultimo.

Perché c’è una tale limitazione?

Perché le specifiche dicono così. Probabilmente lo dice così perché rende l’analisi dei vincoli un po ‘più semplice. C’è poco valore nel permettere di specificare i vincoli in qualsiasi ordine e posso immaginare un costo (incluso il costo opportunità!) Nel renderlo ansible.

Nota, infatti, che la specifica non dice solo che devi avere il vincolo del costruttore per ultimo, se ce l’hai. In realtà dice che devi avere i vincoli nel seguente ordine

  1. Vincolo primario.
  2. Vincoli secondari.
  3. Vincolo del costruttore.

Quando un vincolo principale è uno che specifica il parametro type deve essere un tipo di riferimento o un tipo di valore, i vincoli secondari sono quelli che specificano una class base o interfacce e il vincolo del costruttore è quello in discussione qui.

La sezione pertinente della specifica è §10.1.5 e vale sicuramente la pena leggerla.

Perché su altri vincoli (class per esempio) è ansible specificare un costruttore mentre su altri vincoli non è ansible (Interfacce).

Quindi se new () viene prima, quindi un vincolo su un’interfaccia, si otterrebbe un errore perché non si può avere il nuovo vincolo () sull’interfaccia.

YAQAPD: Ancora un’altra domanda sulla direzione dell’analisi

Ogni linguaggio di programmazione ha le sue regole. La direzione dell’analisi è una di queste. Lasciatemi spiegare in maggiore dettaglio (sii paziente).

Supponiamo di scrivere la seguente funzione in Pascal / Delphi:

 function Sum2Numbers (n1, n2:integer) : integer; begin result:=n1+n2; end; 

Ora, la stessa funzione in C:

 int function Sum2Numbers (int n1, int n2) { return (n1+n2); } 

Per il punto di vista del programmatore, entrambe le funzioni fanno la stessa cosa (e lo fanno davvero). Tuttavia, dietro le quinte, ogni compilatore funziona a modo suo.

Pascal / Delphi e molti altri linguaggi compilano il codice analizzando il testo da SINISTRA A DESTRA. Quindi, quando chiamiamo la funzione in Pascal o Delphi, il compilatore inserisce la pila, prima n1 e seconda n2 . La stessa funzione in C fa da DESTRA a SINISTRA, cioè i compilatori messi nello stack, prima n2 e seconda n1 .

Entrambi i compilatori leggono i parametri dallo stack nell’ORDINE che conoscono, quindi tutto funziona correttamente.

Tutti i linguaggi “C-family” (C, C ++, Managed C ++, C ++ / CLI, C #, …) usano l’ordine da destra a sinistra di analisi del codice.

Questo è il motivo per cui il new() vincolo new() DEVE essere specificato nel FAR DESTRO della lista dei vincoli.
Il compilatore deve conoscere IN ADVANCE che dovrà creare istanze di classi, PRIMA di usarle.