9

我收到一条我似乎无法弄清楚的错误消息。我看到发布了许多其他类似的问题,但解决方案似乎对我不起作用。

错误信息:

'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

我已经按照页面上的建议尝试了以下内容 (对象)是“字段”,但用作“类型”

PaymentPlanLogic.Logger.createLog();

但我得到了错误

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

3 回答 3

23

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

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

    void YouForgotThisMethod()
    {
      myLog.createLog();
    }
  }
}
于 2013-01-04T09:43:28.933 回答
15

托布西的回答是正确的。出现奇怪错误消息的原因是编译器正拼命地试图弄清楚你的意思。推理是这样的:

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

当然,这是对编译器的不合理拟人化,但您要抓住重点:编译器的错误代码“心理模型”与您编写损坏代码时的想法大不相同,因此错误消息不是很有帮助. 编译器认为你知道一个语句不能去那里,并且把一个字段和一个类型混在一起了。更复杂的算法会让编译器猜测,由于您键入的是合法语句,因此真正的错误是该语句位于块之外。

编写错误消息生成器来准确模拟编写损坏代码的人的心理过程是相当困难的。

于 2013-01-04T16:21:28.523 回答
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 的新实例时执行。

于 2013-01-04T09:43:47.910 回答