簡體   English   中英

非靜態字段所需的對象引用

[英]Object reference required for a non-static field

我收到一個錯誤“非靜態字段,方法或屬性'Excel1.Program.GetAllTemplateNames(string,string)需要對象引用”,我知道這很愚蠢,但是我對C#還是很陌生,可以這樣做在調試此代碼方面有一些幫助。 甚至可以從Main函數調用靜態函數嗎? 有這些疑問。

由於ProcessInput是靜態的,因此如果沒有此類的實例( Program ),則無法從那里調用instance(非靜態)方法GetAllTemplateNames

因此,您需要使GetAllTemplateNames也為靜態,或者需要使ProcessInput為非靜態。 我將選擇第二個選項,因為GetAllTemplateNames需要訪問一些實例變量,而這些變量在靜態時是不可能的。

因此,可以通過以下方式更改ProcessInput的簽名(請注意,省略了static ):

public void ProcessInput(String strRetVal, String strFunctionName, /*String strParamCount,*/ String strParam1, String strParam2, String strParam3, String strParam4)

現在您還需要將main中此方法的調用更改為:

var p = new Program();  // create an instance
p.ProcessInput(strRetVal, strFunctionName, /*strParamCount,*/ strParam1, strParam2, strParam3, strParam4);

MSDN:靜態

如果希望不使用類的實例而從其他靜態方法調用GetAllTemplateNames方法,則應將其GetAllTemplateNames static

public static void GetAllTemplateNames(String strParam, String strRetVal)

這也意味着此方法使用的字段( templateClienttaskClient也必須是靜態的)

或者另一種可能性是創建包含類的實例:

new Program().GetAllTemplateNames(strParam1, strRetVal);

更改此行

      GetAllTemplateNames(strParam1, strRetVal);

      new Program().GetAllTemplateNames(strParam1, strRetVal);

或將方法設為靜態。

該問題發生在GetAllTemplateNames(strParam1, strRetVal); ,以及對GetAllTemplateNames()ReturnAllTemplateNames()任何其他調用。

這些方法不是靜態的,但是您是從靜態方法調用它們的! 您需要將它們設為靜態,或創建其包含類的實例,以便從諸如main()類的靜態方法中調用它們。

主要功能是靜態的,這就是為什么您可以調用ProcessInput的原因。 但是,不能從靜態函數調用非靜態函數:GetAllTemplateNames必須是靜態函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM