È nella sezione 18.6 della specifica - la dichiarazione fixed
.
Le produzioni rilevanti sono:
-dichiarazione fisso:
fixed (
puntatore di tipo-pointer-dichiaratori fisse)
embedded-dichiarazione
fissi -pointer-dichiarator:
identificatore=
-pointer-inizializzatore fisso
-pointer-inizializzatore fisso:
&
variabile riferimento
espressione
Si sta tentando di utilizzare la versione espressione. Ora, mentre ci non è una conversione normale" come espressione * string
-char *
, le specifiche chiama il caso string
, dicendo che un puntatore-inizializzatore fisso può essere:
Un'espressione di digitare string
, a condizione che il tipo char*
sia implicitamente convertibile nel tipo di puntatore indicato nell'istruzione fissa. In questo caso, l'inizializzatore calcola l'indirizzo del primo carattere nella stringa e l'intera stringa è garantita per rimanere a un indirizzo fisso per la durata dell'istruzione fissa. Il comportamento dell'istruzione fissa è definito dall'implementazione se l'espressione della stringa è null
.
Quindi, anche se sembra come si sta solo eseguendo una dichiarazione di variabile normale e l'utilizzo di una conversione implicita string
-char *
, si sta davvero facendo uso di un caso particolare di ciò che l'espressione in una fissa -pointer-inizializzatore è permesso di essere.
fonte
2015-09-24 19:58:30
Non sono sicuro del motivo per cui questo è downvoted - mi sembra una buona domanda; chiaro su ciò che è previsto, chiaro sull'errore ecc. Guardando nelle specifiche ora. –
Mentre Jon sta guardando le specifiche, lascia che ti mostri il [lato dell'implementazione delle cose] (http://stackoverflow.com/a/32465407/3764814). In breve: il tipo CLI di * giace * sul puntatore a un oggetto 'stringa' e ti dà invece il puntatore al suo primo carattere (lo fa anche per gli array). Casi speciali nel runtime ;-) –
@LucasTrzesniewski Mi sono imbattuto in questa domanda durante la ricerca di diverse implementazioni di 'string.GetHashCode()' che è diversa nelle diverse versioni di BCL e anche diversa in Mono. In * alcune implementazioni * non zero 'RuntimeHelpers.OffsetToStringData' viene aggiunto al valore del puntatore prima dell'elaborazione. Ciò potrebbe significare che indipendentemente dal fatto che punti al primo carattere sia dipendente dalla versione. –