[英]what is the default constructor access modifer?
我對默認構造函數訪問修飾符是什么感到困惑,這個MSDN狀態說明是什么
If the direct base class does not have an accessible parameterless instance constructor, a compile-time error occurs.
因為當我用測試程序應用它時,它失敗了。 我可以創建一個繼承另一個類的對象或類,但是沒有定義外部無參數構造函數。
class A
{
}
class B : A
{
}
class C
{
public void main()
{
B objB = new B();// as per MSDN here should be the compile time error.
}
}
[ 來源 ]
如果直接基類沒有可訪問的無參數實例構造函數,則會發生編譯時錯誤。
如果沒有為類定義構造函數,編譯器將自動生成公共默認構造函數。
如果類不包含實例構造函數聲明, 則會自動提供默認實例構造函數 。 該默認構造函數只是調用直接基類的無參數構造函數。 如果直接基類沒有可訪問的無參數實例構造函數,則會發生編譯時錯誤。 如果類是抽象的,那么默認構造函數的聲明可訪問性將受到保護。 否則,默認構造函數的聲明可訪問性是公共的。
在您的示例中,所有類A,B,C都是使用默認的內部無參數構造函數創建的。
由於兩個類在同一個程序集中,並且內部具有內部構造函數,因此默認情況下不會出現編譯錯誤。 但是如果在類B中聲明一個不可訪問的構造函數(例如private或protected),您將在示例中遇到編譯錯誤。
如果您不自己創建一個無參數構造函數,編譯器會創建無參數構造函數,因此根據MSDN頁面,您的示例實際上最終看起來像這樣;
class A
{
public A(): base() {}
}
class B : A
{
public B(): base() {}
}
你對new B()
調用最終會調用A的構造函數。 但是,如果您為A創建了一個私有的顯式構造函數;
class A
{
private A() {}
}
class B : A
{
}
然后這轉化為;
class A
{
private A() {}
}
class B : A
{
public B(): base() {}
}
如果A的構造函數無法訪問,那將無法編譯。
如果沒有為類定義構造函數,編譯器將自動生成public
默認構造函數。
但是,如果定義了一個限制訪問的構造函數,那么編譯器將拋出。
例如,這應該拋出異常:
class A
{
private A() {}
}
class B : A
{
}
Unless the class is static, classes without constructors are
given a public default constructor by the C# compiler in order to
enable class instantiation.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.