2013-03-13 16 views
17

Sto convertendo un'app VB.Net in C# e ho notato che nel codice VB.Net c'è un membro privato variabile, che viene inizializzata usando Me come questo:Perché in C# non è consentito nell'inizializzatore membro, ma in VB.Net Me è consentito

Private m_ClassA As New MyCollection(Of ClassA)(Me) 

Quando ho convertire questo codice C# in questo modo:

private MyCollection<ClassA> _classA = new MyCollection<ClassA>(this); 

ho l'errore

L'argomento è value mentre il tipo di parametro è ref.

Se metto ref davanti al parametro di this, ottengo l'errore

non possono utilizzare this negli Stati initializer.

Ho letto qui che i membri sono inizializzati prima della classe base, e così this non possono essere utilizzati nei membri in quanto non può ancora essere inizializzato. La mia domanda è: perché è legale in VB.Net e non in C#?

E 'il compilatore che lo gestisce diversamente? Sembra strano che i due abbiano comportamenti diversi.

Per aggirarlo suppongo di inizializzare il membro nel contructor.

+0

sembra che tu abbia già risposto alla tua domanda. – Jodrell

+0

Che cos'è 'MyCollection'? – LukeHennerley

+0

Cosa sono 'ClassA' e' MyCollection'? È facile fare supposizioni che potrebbero essere sbagliate ... 'MyCollection' è stato dichiarato con un parametro' ref' non necessario? –

risposta

4

Secondo MSDN.

Un accesso di questo tipo è consentito solo nel blocco di un costruttore di istanza , un metodo di istanza o un accessorio di istanza.

Questo può essere letto here.

Non è possibile accedervi da nessun'altra parte oltre a istanze/costruttori. Così non si poteva fare qualcosa di simile sia:

public class Foo 
{ 
    private Foo _foo = this; 
} 

Come dici tu, nel tuo C# andando ad avere per utilizzare metodi/costruttori.

public class Foo 
{ 
    private Foo _foo; 
    public Foo() 
    { 
    _foo = this; 
    } 
    public void InitializeFoo() 
    { 
    _foo = this; 
    } 
} 

MSDN afferma inoltre quanto segue per Me:

La parola chiave Me fornisce un modo per fare riferimento al caso specifico di una classe o struttura in cui il codice è attualmente in esecuzione. Io si comporta come una variabile oggetto o una variabile di struttura riferendosi all'istanza corrente.

Sembra che una volta che la classe ha eseguito si ottiene l'accesso ai this, ma solo nei metodi di istanza, mentre in VB.NET si ottiene l'accesso al momento la classe è in esecuzione, da qui il motivo per cui non è possibile utilizzare lo come hai affermato

+0

Questo è fantastico, grazie a –

+0

@Matt_J non è un problema. Personalmente, troverei l'inizializzazione del costruttore molto più ordinata, ma probabilmente è preferibile usare 'C#': P – LukeHennerley

2

VB esisteva prima di .NET e VB.NET, quindi esistevano alcune funzionalità che gli sviluppatori non volevano rimuovere quando .NET era stato introdotto. Un'altra caratteristica di questo tipo è "On Error Resume Next", che inoltre non esiste in C#.

+0

Tranne che 'On Error Resume Next' non è in VB.NET. –

Problemi correlati