'field'但用作'type'

Bry*_*anP 9 .net c#

我收到的错误消息似乎无法弄明白.我看到还有很多其他类似的问题,但解决方案似乎并不适合我.

错误信息:

'PaymentPlanStoreLogic.Class1.myLog' is a 'field' but is used like a 'type'
Run Code Online (Sandbox Code Playgroud)

我的代码:

using System;
using PaymentPlanLogic;
namespace PaymentPlanStoreLogic
{
  public class Class1
  {
    Logger myLog = new Logger();
    myLog.createLog();
   }
}
Run Code Online (Sandbox Code Playgroud)

对象浏览器:

public void createLog()
Member of PaymentPlanLogic.Logger
Run Code Online (Sandbox Code Playgroud)

我按照页面(对象)上的建议尝试了以下内容 是'字段'但是像'类型'一样使用

PaymentPlanLogic.Logger.createLog();
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

"'PaymentPlanLogic.Logger.createLog()' is a 'method' but is used like a 'type'"
Run Code Online (Sandbox Code Playgroud)

Tob*_*sey 23

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

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

    void YouForgotThisMethod()
    {
      myLog.createLog();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • YouForgotThisMethod可能是缺少的构造函数(我认为). (2认同)

Eri*_*ert 15

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

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

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

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