継承された読み取り専用フィールドに値を割り当てますか? 質問する

継承された読み取り専用フィールドに値を割り当てますか? 質問する

つまり、多くの子を持つ基本クラスがあります。この基本クラスは、デフォルト値を持つ読み取り専用プロパティと変数をいくつか定義します。これらは子に応じて異なる場合があります。

読み取り専用プロパティ/フィールドを使用すると、コンストラクター内および定義内の変数の値を変更できますが、他の場所では変更できません。子クラスのコンストラクターで継承された読み取り専用変数の値を変更しようとすると、「読み取り専用変数はコンストラクター内でのみ割り当てることができます」というエラーが発生します。これはなぜですか。また、リフレクションを使用せずにこれを回避するにはどうすればよいですか。

私の意図: 特定のフィールドを一度だけ変更できるスクリプトを通じて、ユーザーの拡張性を可能にすることです。

ベストアンサー1

理由は、割り当てることができるのは読み取り専用そのクラスのコンストラクタのフィールド
の定義読み取り専用C#リファレンス(強調は筆者による):

フィールド宣言にreadonly修飾子が含まれている場合、宣言によって導入されたフィールドへの代入は宣言の一部としてのみ発生するか、同じクラスのコンストラクタ内

この問題を回避するには、ベースに、読み取り専用プロパティのパラメータを受け取る保護されたコンストラクターを作成します。

例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Base b = new Child();
            Console.WriteLine(b.i);
            Console.Read();
        }
    }

    class Base
    {
        public readonly int i;

        public Base()
        {
            i = 42;
        }

        protected Base(int newI)
        {
            i = newI;
        }
    }

    class Child : Base
    {
        public Child()
            : base(43)
        {}
    }
}

おすすめ記事