‘field’但用作’type’

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

错误信息:

'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'" 

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

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

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

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

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

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

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的新实例时执行。