2013-03-13 61 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

相关问题