2013-03-13 40 views
17

我轉換VB.Net應用到C#,並已注意到,在VB.Net代碼中,有一個私有成員變量,這是使用Me這樣初始化:爲什麼在C#在這個成員的初始值是不允許的,但在VB.Net我被允許

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

當我將它轉換爲C#代碼是這樣的:

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

我有錯誤

參數是value而參數類型是ref

如果我在參數this前面放ref,我得到的錯誤

不能在成員初始使用this

我在這裏讀了成員的基類初始化之前,所以this不能在成員使用,因爲它可能尚未被初始化。我的問題是爲什麼它在VB.Net合法而不是C#?

這是下降到編譯器的不同處理呢?這兩個人有不同的行爲似乎很奇怪。

要解決它,我想我會在初始化的構造器的成員。

+0

聽起來像你已經回答你的問題。 – Jodrell 2013-03-13 09:18:21

+0

什麼是MyCollection? – LukeHennerley 2013-03-13 09:22:17

+0

什麼是'ClassA'和'MyCollection'?很容易做出錯誤的假設......'MyCollection'是否聲明瞭一個不必要的'ref'參數? – 2013-03-13 09:23:37

回答

4

MSDN

此訪問權限只允許在實例 構造函數,實例方法或實例訪問器的塊中使用。

這可以被讀取here

無法訪問此隨地真的比實例/構造等。所以,你不能做這樣的事情之一:

public class Foo 
{ 
    private Foo _foo = this; 
} 

正如你所說,在C#你將不得不使用的方法/構造函數。

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

MSDN還規定爲Me以下:

Me關鍵字提供了一種方法來指代,其中所述代碼是當前正在執行一個 類或結構的具體實例。 Me 的行爲像是對象變量或引用當前實例的結構變量 。

這聽起來像一旦類已經執行您可以訪問this,但只在實例方法,而在VB.NET你在類執行時間的訪問,因此你之所以不能使用它正如你所說的那樣。

+0

這太好了,謝謝 – 2013-03-13 09:36:58

+0

@Matt_J不成問題。就個人而言,我會發現構造函數的初始化很簡單 - 但是可能只是喜歡'C#':P – LukeHennerley 2013-03-13 09:57:44

2

VB在.NET和VB.NET之前就已經存在了,所以開發人員在.NET引入時不想刪除一些功能。另一個這樣的功能是「On Error Resume Next」,這在C#中也不存在。

+0

除了「On Error Resume Next」不在VB.NET中。 – 2014-12-10 19:42:59

相關問題