2013-04-24 14 views
5

Ho iniziato a imparare C#. Sto cercando di dichiarare una classe e alcune variabili e provare a fare una semplice concatenazione di stringhe. Ma sto ottenendo un errore - il codice è inferiore aHo bisogno di spiegazioni con il codice C# per principianti

namespace ConsoleApplication1 
{ 
    class Class1 
    { 
     string s1 = "hi"; 
     string s2 = "hi"; 
     string s3 = s1 + s2; 
    } 
} 

L'errore che sto ottenendo è - un inizializzatore di campo non può fare riferimento il campo non statico, il metodo, la proprietà 'ConsoleApplication1.Class1.s1

Qualcuno può spiegare cosa sta succedendo qui.

Grazie.

risposta

15

qualcuno può spiegare cosa sta accadendo qui.

Bene, il messaggio di errore del compilatore dice tutto, davvero, una volta superata la terminologia. Questa linea non è valida:

string s3 = s1 + s2; 

Stai dichiarando variabili di istanza, e istanze inizializzatori variabili (s1 + s2 qui) non sono autorizzati a fare riferimento ad altri campi all'interno dell'istanza che è stato creato - o addirittura l'istanza stessa. Si tenga presente che la dichiarazione di cui sopra è equivalente a:

string s3 = this.s1 + this.s2; 

Dalla sezione 10.5.5.2 della specifica C# 4:

Un inizializzatore variabile per un campo di esempio non può fare riferimento l'istanza creata. Quindi è un errore in fase di compilazione fare riferimento a this in un inizializzatore di variabile, poiché è un errore in fase di compilazione per un inizializzatore di variabile per fare riferimento a qualsiasi membro di istanza tramite un nome .

(Certo che è uno dei bit più più strane della formulazione della spec ...)

Devi mettere la logica nel corpo del costruttore, invece:

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 

    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
6

Prova inizializzazione s3 in un metodo, preferibilmente un costruttore

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 


    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
+3

Non è il fatto che sta facendo "aritmetica" (concatenazione di stringhe) qui che è il problema - è il fatto che usa implicitamente "questo". –

8

variabili non sono [logicamente] inizializzati in un ordine particolare. È meglio progettare i programmi in modo che funzionino indipendentemente dall'ordine in cui le variabili vengono inizializzate.

Per le assegnazioni non banali della variabili locali si utilizza un costruttore per quel tipo:

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 

    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
+7

Questo non è corretto. Dalla sezione 10.5.5 della specifica C# 4 (la versione che mi capita di avere a portata di mano): "Allo stesso modo, quando viene creata un'istanza di una classe, tutti i campi di istanza in quell'istanza vengono inizialmente inizializzati con i loro valori predefiniti, quindi gli inizializzatori dei campi di istanza vengono eseguiti ** in ordine testuale **. " (Enfasi mia.) –

+0

@JonSkeet Ho modificato il testo. Indipendentemente dal fatto che l'implementazione abbia un ordine, da un punto di vista concettuale, non lo è, ed è meglio svilupparlo come se fosse non ordinato. – Servy

+0

Questo è abbastanza facilmente confermato usando il debugger. Ho sicuramente notato questo comportamento sull'inizializzazione del campo di istanza nel mio codice. – Chris

Problemi correlati