2012-05-17 29 views
0

我想從基礎構造函數調用overriden屬性,但我收到System.Reflection.TargetInvovationException(「對象引用未設置爲對象的實例。」)。爲什麼這個錯誤被拋出,並且可以做任何事情來避免它?Overriden屬性和TargetInvocationException

我會期望構造函數剛纔調用了overriden屬性。

這裏是一個精簡的例子:

// 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; } 
    } 
} 

回答

1

您有其他問題怎麼回事。該代碼,鍵入,工作。試試這個功能齊全的程序來查看,打印(如預期)「富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; } 
     } 
    } 
} 

話雖這麼說,在構造函數中調用虛函數(包括屬性訪問方法)是一個非常糟糕的主意。它可能會導致非常奇怪的行爲,這可能是您真實代碼中的罪魁禍首。

+0

感謝您的快速響應,是的,這是一個更深的空ptr,出於某種原因沒有出現。 – Hubris