在任何上下文中从派生类访问继承保护构造函数都会引发数据封装问题。
从历史上看,C#自从第一个版本开始允许这种访问。但是它在VS 2005中得到了修复。派生类现在只能从它们自己的构造函数中调用它们的基础保护构造函数。
class Base
{
protected Base()
{
}
}
class Derived : Base
{
public Derived() : base() // Still allowed in VS 2005
{
}
public void Main()
{
Base b = new Base(); // Allowed in VS 2003, but error in VS 2005
}
}
在VB.NET中,可以用两种方式初始化变量。首先是赋值运算符跟在声明后面;其次是“新的”声明。
在受保护的构造函数的情况下,“As New”始终正常工作。至于赋值初始化,它会引发编译错误。但是如果基类中有多个构造函数,那么赋值初始化也会起作用!
Class Base
Protected Sub New()
End Sub
End Class
Class Derived
Inherits Base
Public Sub Main()
Dim foo As New Base // Allowed
Dim moo As Base = New Base() // Error if Base has only one constructor
End Sub
End Class
很可能是VB.NET允许这种访问的原因是与遗留代码兼容。
更多细节:http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx
其实,有在VB地方,你都可以在构造函数,你不能在C#。这就是他得到这个错误的原因。详情请参阅我的帖子。 – 2009-02-04 00:32:31