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 回答