'field'但用作'type'

时间:2013-01-04 09:39:06

标签: c# .net

我收到的错误信息似乎无法弄明白。我发现还有很多其他类似的问题,但解决方案对我来说似乎没有用。

错误讯息:

'PaymentPlanStoreLogic.Class1.myLog' is a 'field' but is used like a 'type'

我的代码:

using System;
using PaymentPlanLogic;
namespace PaymentPlanStoreLogic
{
  public class Class1
  {
    Logger myLog = new Logger();
    myLog.createLog();
   }
}

对象浏览器:

public void createLog()
Member of PaymentPlanLogic.Logger

我按照页面上的建议尝试了以下操作 (object) is a 'field' but is used like a 'type'

PaymentPlanLogic.Logger.createLog();

但是我收到了错误

"'PaymentPlanLogic.Logger.createLog()' is a 'method' but is used like a 'type'"

3 个答案:

答案 0 :(得分:23)

您无法在方法之外的字段上调用方法:

using System;
using PaymentPlanLogic;
namespace PaymentPlanStoreLogic
{
  public class Class1
  {
    Logger myLog = new Logger();

    void YouForgotThisMethod()
    {
      myLog.createLog();
    }
  }
}

答案 1 :(得分:15)

托宾的回答是正确的。奇怪错误消息的原因是因为编译器拼命想弄清楚你的意思。推理是这样的:

  

此时唯一合法的事情是类,接口,结构,枚举,字段,运算符,索引器,事件,属性,方法,构造函数和析构函数的声明。它不能是类,接口,结构或枚举,因为它们都有一个关键字。它不能是构造函数或析构函数。因此,用户必须尝试创建字段,运算符,索引器,事件,属性或方法。所有这些事情都可以合法地从一种类型开始。好的,所以这个表达式必须试图识别一个类型。但它没有识别出一种类型;它标识一个字段。所以这就是我给出的错误。

当然这是编译器的一种不合理的拟人化,但你要明白:编译器的错误代码的“心理模型”与你在编写损坏的代码时的想法非常不同,所以错误信息是不是很有帮助。 编译器认为你知道一个语句不能去那里,并且混淆了一个带有类型的字段。一个更复杂的算法会让编译器猜测,因为你输入的是一个法律声明,真正的错误是该语句在一个块之外。

编写错误消息生成器,可以准确地模拟编写损坏代码的人的心理过程非常困难。

答案 2 :(得分:2)

Class1的定义不完整。你不能在类中调用这个方法,你可以在类的方法中调用它:

using System;
using PaymentPlanLogic;
namespace PaymentPlanStoreLogic
{
    public class Class1
    {
        #region Members

        Logger myLog;

        #endregion

        #region Constructors

        public Class1()
        {
            myLog = new Logger();
            myLog.createLog();
        }

        #endregion
    }
}

然后createLog()将在实例化Class1的新实例时执行。