在任何上下文中從派生類訪問繼承保護構造函數都會引發數據封裝問題。
從歷史上看,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