2016-01-06 25 views
0

我已經從MVC控制器 -甲字段初始不能引用非靜態字段,方法或特性在ASP.Net MVC控制器

public abstract class BaseController : Controller 
{ 
    protected int A= Convert.ToInt32(ConfigurationManager.AppSettings["A"]); 
    protected int B= Convert.ToInt32(ConfigurationManager.AppSettings["B"]); 

    protected int C= A* B; 
} 

繼承了BaseController類它編譯期間給出錯誤A field initializer cannot reference the non-static field, method, or property

我沒有任何構造函數。這就是這個類的完整代碼。 有什麼幫助嗎?

+0

你可以在構造函數中初始化C嗎?在實例化過程中搜索字段初始值設定項和構造函數的順序,這個限制與該主題有關。 –

+0

你能顯示BaseController的完整代碼嗎?你有沒有定義這個控制器的任何構造函數? –

回答

2

錯誤信息,涉及到您嘗試分配C A * B.

嘗試創建一個受保護的構造器是進行賦值操作的值,確保您的子類,然後調用此基礎構造。

0

簡而言之,字段初始值設定項在繼承鏈中的任何構造函數之前運行。所以那個時候這個對象還沒有被構造,所以非靜態成員不能被使用。

退房此相關many time quoted article

如果這些都是一些初始值,一個解決辦法是重構A*B分配直接使用配置參數。

1

由於BaseController是一個抽象類,因此無法創建該類的實例。所以,你不能調用抽象類的構造函數。但是你必須有一個構造函數來運行下面的代碼。

protected int C= A* B; 

所以,只能從派生類創建抽象或基類的構造函數和調用基構造函數,如下所示。

public DerivedClass() : base() { 
    // Do additional work here otherwise you can leave it empty 
} 
相關問題