0

基本コンストラクターからオーバーライドされたプロパティを呼び出そうとしていますが、System.Reflection.TargetInvovationException( "オブジェクト参照がオブジェクトのインスタンスに設定されていません。")を受け取ります。このエラーがスローされるのはなぜですか?それを回避するために何かできることはありますか?

コンストラクターがオーバーライドされたプロパティを呼び出しただけだと思っていたでしょう。

簡略化した例を次に示します。

// Call that generates exception
var foo = new Foo();

public class Foo : Bah {

    public Foo() : base("Foo!") {}

    public override string Name {
        get { return _name + "123"; }
        set { _name = value; }
    }
}

public class Bah {

    protected string _name;

    public Bah(string name) {
        Name = name; // << -- Exception here
    }

    public virtual string Name {
        get { return _name; }
        set { _name = value; }
    }
}
4

1 に答える 1

1

他にも問題が発生しています。入力されたコードは機能します。この完全に機能するプログラムを試して、(予想どおりに)「Foo!123」を出力するプログラムを確認してください。

using System;

namespace Test
{
    public class Program
    {
        private static void Main()
        {
            var foo = new Foo();
            Console.WriteLine(foo.Name);
            Console.ReadKey();
        }
    }

    public class Foo : Bah
    {
        public Foo() : base("Foo!") { }

        public override string Name
        {
            get { return _name + "123"; }
            set { _name = value; }
        }
    }

    public class Bah
    {
        protected string _name;

        public Bah(string name)
        {
            Name = name; // << -- No Exception here (or anywhere!)
        }

        public virtual string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
}

そうは言っても、コンストラクターで仮想メソッド(プロパティアクセサーメソッドを含む)を呼び出すことは非常に悪い考えです。それは非常に奇妙な振る舞いにつながる可能性があり、それはおそらくあなたの実際のコードの原因です。

于 2012-05-17T01:24:39.947 に答える