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

トブシーの答えは正しいです。奇妙なエラーメッセージの理由は、コンパイラがあなたが何を意味するのかを必死に理解しようとしているためです。推論は次のようになります。

この時点で有効なのは、クラス、インターフェイス、構造体、列挙型、フィールド、演算子、インデクサ、イベント、プロパティ、メソッド、コンストラクタ、およびデストラクタの宣言だけです。これらはすべてキーワードを含んでいるため、クラス、インターフェイス、構造体、列挙型にすることはできません。コンストラクタまたはデストラクタにすることはできません。したがって、ユーザーはフィールド、オペレーター、インデクサー、イベント、プロパティ、またはメソッドを作成しようとしている必要があります。これらはすべて、合法的に型で始まる場合があります。OK、したがって、この式はタイプを識別しようとしている必要があります。ただし、タイプは識別されません。フィールドを識別します。それが私が与えるエラーです。

もちろん、これはコンパイラの不当な擬人化ですが、要点を説明します。誤ったコードのコンパイラの「メンタルモデル」は、壊れたコードを書いたときに考えていたものとは大きく異なるため、エラーメッセージはあまり役に立ちません。 。コンパイラーは、ステートメントがそこに行けないことを知っていると考えており、フィールドとタイプを混同しています。より洗練されたアルゴリズムでは、入力したのは正当なステートメントであるため、実際のエラーはステートメントがブロックの外にあることであるとコンパイラーに推測させます。

壊れたコードを書いている人々の精神的プロセスを正確にモデル化するエラーメッセージジェネレータを書くことは非常に困難です。

于 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 に答える