2010-07-18 185 views
7

這是簡單的解釋: 這個作品堆棧溢出異常

using System; 
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>; 

namespace ConsoleApplication2 
{ 
    class test 
    { 
     public ConstraintSet a { get; set; } 
     public test() 
     { 
      a = new ConstraintSet(); 
     } 
     static void Main(string[] args) 
     { 
      test abc = new test(); 
      Console.WriteLine("done"); 
     } 
    } 
} 

這並不

using System; 
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>; 

namespace ConsoleApplication2 
{ 
    class test 
    { 
     public ConstraintSet a { get { return a; } set { a = value; } } 
     public test() 
     { 
      a = new ConstraintSet(); 
     } 
     static void Main(string[] args) 
     { 
      test abc = new test(); 
      Console.WriteLine("done"); 
     } 
    } 
} 

我得到一個堆棧溢出異常上的二傳手在第二類和我做不知道爲什麼。我不能使用第一種形式,因爲它不受統一引擎的支持

+0

'我不能使用第一種形式,因爲它不是由統一engine'支持...第一種形式是一個編譯器級的簡寫。它應該適用於統一引擎。 – SLaks 2010-07-18 15:44:48

+1

[類屬性上的StackOverFlow]的可能重複(http://stackoverflow.com/questions/680765/stackoverflow-on-class-property)以及其他許多。 – 2010-07-18 15:45:55

+0

nope,unity c#編譯器不支持這種語法 – Patrik 2010-07-18 15:56:41

回答

24

當您編寫a = value時,您再次調用屬性設置器。

爲了使用非自動屬性,你需要創建一個獨立的私人支持字段,就像這樣:

ConstraintSet a; 
public ConstraintSet A { get { return a; } set { a = value; } } 
+1

不知道爲什麼這個答案是downvoted,因爲它是更多的信息,科里拉爾森的... – 2010-07-18 15:48:49

+0

@Jon:我很驚訝我得到任何投票時,我只是張貼你身後的秒數:P。我今天早上太昏昏沉沉地解釋**爲什麼**,所以毫無疑問,SLak和你的答案都更好。 – 2010-07-18 16:44:44

+0

@Cory:我沒有特別反對你的回答,因爲它確實解決了問題 - 但沒有解決問題。可能有人只是不喜歡高代表的人。 – 2010-07-18 16:46:16

15

您還沒有聲明的後盾變量 - 你拿到它的屬性獲得者和制定者稱自己。這不是很清楚,我爲什麼第一種形式不統一的支持 - 這意味着它有可能是相當於將不進行支持,但它基本上是這樣的:

private ConstraintSet aValue; 
public ConstraintSet a { get { return aValue; } set { aValue = value; } } 

我通常有更傳統的名字,當然 - 這意味着你可以逃脫沒有「value`位:

private ConstraintSet constraints; 
public ConstraintSet Constraints 
{ 
    get { return constraints; } 
    set { constraints = value; } 
} 

爲了給多一點細節,爲什麼你目前的第二種形式拋出StackOverflowException,你應該永遠記住,屬性基本上是僞裝的方法。破碎的代碼如下所示:

public ConstraintSet get_a() 
{ 
    return get_a(); 
} 

public void set_a(ConstraintSet value) 
{ 
    set_a(value); 
} 

希望這很明顯,爲什麼這個版本吹的堆棧。修改後的版本只是設置一個變量,而不是再次調用的屬性,所以擴展時,它看起來是這樣的:

private ConstraintSet _a; 
public ConstraintSet a { get { return _a; } set { _a = value; } } 
+0

@Downvoter:小心給個理由? – 2010-07-18 15:47:20

+0

只是統一的C#編譯器不支持什麼可視化的C#。這是因爲它必須保持兼容性與單聲道 – Patrik 2010-07-18 16:00:23

+0

@Patrik:Mono也支持C#3 ... C#3已經出現了近3年;這不完全是一個新功能。 – 2010-07-18 16:03:15

3

你在你的公共財產需要一個私人的支持變量getter和setter中的相同變量名稱。
這將導致它自己調用,並最終將stackoverflow。遞歸太多。
你需要一個後盾變量:

private ConstraintSet _a; 
public ConstraintSet a { get { return _a; } set { _a = value; } } 
3

不能使用:

private ConstraintSet aValue; 

public ConstraintSet get_a() 
{ 
    return aValue; 
} 

public void set_a(ConstraintSet value) 
{ 
    aValue = value; 
}