非静态字段所需的对象引用

时间:2012-06-18 09:42:22

标签: c# .net

我收到错误“非静态字段,方法或属性需要对象引用'Excel1.Program.GetAllTemplateNames(string,string)”我知道这很傻但是我对C#很新并且可以在调试此代码时提供一些帮助。甚至可以从Main函数调用静态函数吗?我有这些疑虑。

5 个答案:

答案 0 :(得分:4)

由于ProcessInput是静态的,因此您无法从该处调用实例(非静态)方法GetAllTemplateNames,而无需具有此类的实例(Program)。

因此,您需要将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: static

答案 1 :(得分:3)

如果您希望能够在没有类实例的情况下从其他静态方法调用它,则应该创建GetAllTemplateNames方法static

public static void GetAllTemplateNames(String strParam, String strRetVal)

这也意味着此方法使用的字段(templateClienttaskClient也必须是静态的)

或另一种可能性是创建包含类的实例:

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

答案 2 :(得分:2)

更改此行

      GetAllTemplateNames(strParam1, strRetVal);

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

或使方法成为静态。

答案 3 :(得分:2)

问题发生在GetAllTemplateNames(strParam1, strRetVal);行,以及对GetAllTemplateNames()ReturnAllTemplateNames()的任何其他调用。

这些方法不是静态的,但您是从静态方法调用它们的!您需要将它们设置为静态,或者创建其包含类的实例,以便从main()等静态方法调用它们。

答案 4 :(得分:1)

主要功能是静态的,这就是你可以调用ProcessInput的原因。但是,您不能从静态函数调用非静态函数:GetAllTemplateNames必须是静态函数。