2015-09-24 11 views
8

Questo compila:Conversione stringa per la sintassi del puntatore

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = s) 
    {    
      // do some works 
    } 
} 

Questo non lo fa:

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = (char*)s) 
    {    
      // do some works 
    } 
} 

CS0030 errore: Impossibile convertire il tipo 'string' a 'char *'

Non riesco a trovare il punto nello c# spec che consente la prima sintassi ma proibisce il secondo. Potete aiutare e sottolineare dove si parla di questo?

+0

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. –

+0

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 ;-) –

+2

@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. –

risposta

7

È 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.

Problemi correlati