ホームページ >バックエンド開発 >C++ >C# フィールド初期化子で非静的メンバーを参照できないのはなぜですか?

C# フィールド初期化子で非静的メンバーを参照できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-31 08:31:081006ブラウズ

Why Can't I Reference Non-Static Members in C# Field Initializers?

フィールド初期化子は非静的メンバーを参照できない: 詳細な説明

フィールド初期化子を使用してクラスのフィールドを初期化しようとした場合、特定の制限を遵守することが重要です。質問が指摘しているように、フィールド初期化子内で非静的メンバーを参照するとエラーが発生します。

提供されたコードは、Service クラス内でこの問題を示しています。

public class Service
{
    DinnerRepository repo = new DinnerRepository(); // Error: Cannot reference non-static member `repo`
    Dinner dinner = repo.GetDinner(5);
}

エラーが発生する理由は、フィールドイニシャライザは、クラスの非静的メンバーを参照することを許可されていません。これには、インスタンス変数、メソッド、プロパティが含まれます。

代替ソリューション:

回答で提案されている代替ソリューションには次のものがあります:

  • コンストラクターの使用初期化:

    • このアプローチでは、フィールド値はクラスのコンストラクター内で初期化されます:
public class Service
{
    private readonly DinnerRepository repo;
    private readonly Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}
  • ローカルの使用変数:

    • このオプションには、フィールド初期化子でのローカル変数の宣言が含まれます:
public class Service
{
    DinnerRepository repo;
    Dinner dinner;

    public Service()
    {
        repo = new DinnerRepository();
        dinner = repo.GetDinner(5);
    }
}

ただし、次の点に注意することが重要です。後者のアプローチでは、インスタンスではなくローカル変数のみが作成されます。 variables.

フィールド初期化子の制限:

C# 4 仕様 (セクション 10.5.5.2) によれば、フィールド初期化子は作成中のインスタンスを参照できません。したがって、フィールド初期化子内の単純な名前を介してインスタンス メンバーを直接参照することは禁止されています。

概要:

「フィールド初期化子は非静的フィールドを参照できません」を回避するには、メソッド、またはプロパティ」エラーが発生した場合は、フィールド初期化子の制限を理解し、コンストラクターの初期化やローカル変数の使用などの適切な代替アプローチを採用することが重要です。これらの代替方法により、クラスのインスタンス メンバーを適切に初期化できます。

以上がC# フィールド初期化子で非静的メンバーを参照できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。