2013-03-13 12 views
17

Ich konvertiere eine VB.Net App in C#, und habe festgestellt, dass in der VB.Net-Code ist ein privates Mitglied Variable, die Me wie dies mit initialisiert:Warum in C# ist dies nicht in Member-Initialisierer erlaubt, aber in VB.Net ist mir erlaubt

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

Wenn ich wandeln diese # Code wie folgt zu C:

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

ich habe den Fehler

Argument ist value, während Parametertyp ref ist.

Stecke ich ref vor dem Parameter this, erhalte ich die Fehler

nicht this in Elementinitialisierung verwenden können.

Ich habe hier gelesen, dass die Mitglieder vor der Basisklasse initialisiert werden, und so this können nicht Mitglieder verwendet werden, da es noch nicht initialisiert werden kann. Meine Frage ist, warum ist es legal in VB.Net und nicht C#?

Liegt das daran, dass der Compiler anders damit umgeht? Es scheint komisch, dass die beiden unterschiedliche Verhaltensweisen haben.

Um es zu umgehen, ich denke, ich werde das Mitglied im Konstruktor initialisieren.

+0

klingt wie Sie bereits beantwortet Sie Frage. – Jodrell

+0

Was ist 'MyCollection'? – LukeHennerley

+0

Was sind 'ClassA' und' MyCollection'? Es ist leicht, Annahmen zu treffen, die falsch sein könnten ... Wurde 'MyCollection' mit einem unnötigen Ref-Parameter deklariert? –

Antwort

4

Nach MSDN.

Ein this-Zugriff ist nur im Block einer Instanz Konstruktor, einer Instanzmethode oder eines Instanzaccessors zulässig.

Dies kann here gelesen werden.

Sie können nirgendwo anders als auf Instanz/Konstruktoren zugreifen. So konnte man nicht so etwas wie dies entweder:

public class Foo 
{ 
    private Foo _foo = this; 
} 

Wie Sie sagen, in C# Ihr gehen zu müssen Methoden/Konstrukteuren verwenden.

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

MSDN erklärt auch die folgenden für Me:

Die Me Schlüsselwort eine Möglichkeit bietet, auf die spezifische Instanz einer Klasse oder Struktur zu beziehen, in dem der Code gerade ausgeführt wird. Me verhält sich entweder wie eine Objektvariable oder eine Strukturvariable , die sich auf die aktuelle Instanz bezieht.

Es klingt wie, wenn die Klasse, die Sie Zugriff auf this bekommen ausgeführt hat, aber nur innerhalb der Instanz-Methoden während in VB.NET Sie die Klasse Zugang zu dem Zeitpunkt erhalten ausgeführt wird, daher auch der Grund, warum Sie es nicht verwenden können, wie du gesagt hast.

+0

Das ist großartig, danke –

+0

@Matt_J kein Problem. Persönlich würde ich die Konstruktorinitialisierung viel besser finden - aber das liegt wahrscheinlich an der Bevorzugung von 'C#': P – LukeHennerley

2

VB existierte vor .NET und VB.NET, daher gab es einige Funktionen, die Entwickler nicht entfernen wollten, wenn .NET eingeführt wurde. Eine weitere solche Funktion ist "On Error Resume Next", die auch in C# nicht existiert.

+0

Außer 'On Error Resume Next' ist auch nicht in VB.NET. –

Verwandte Themen