2016-01-05 67 views

回答

2

因爲在您的Get您正在閱讀財產,導致無限循環。使用後臺字段。

private double? _value; 
public double? Value 
{ 
    get { return _value.HasValue ? (double?) Math.Round(_value.Value, 1) : null; } 
    set { _value = value; } 
} 

編輯:我也想指出,這是非常容易的情況下,這是非常糟糕的代碼。首先,揭露公開製片人有點不爽,但這隻比公開場地好一點。另外,使用代碼可以將一件事物分配給一個變量,但是如果您之後在行上檢查它,這個值真的很混亂。我會考慮將舍入邏輯移入setter,移除可空性(如果適用),完全刪除可變性(再次,如果適用)並在構造函數中注入該值。

+0

這是一個ViewModel,我認爲在ViewModel中有getter和setter的公共屬性是標準做法。 另外我認爲舍入錯誤來自服務器。 您將其設置爲7.6,它將返回7.59999 ...一些其他值。 –

+0

@LeighCooper - 那麼你應該使用'decimal'。 –

+0

我同意Martin的觀點,如果數據類型不會削減它,請使用另一個。儘管我承認setter在視圖模型中更易於接受,但我仍然認爲在getter中轉換值是邪惡(tm),部分原因是它使客戶感到困惑,部分原因是代碼每次獲得值時都會運行一次當你分配它。 – kai

2

因爲在setter中你正在給setter分配一個值,這意味着setter被再次調用。 setter自始至終都會自動調用stackoverflow例外。吸氣劑也是一樣。

你應該有一個真正的變量來存儲值:

public double? Value 
{ 
    get 
    { 
     return myValue.HasValue ? (double?)Math.Round(myValue.Value, 1) : null; 
    } 
    set 
    { 
     myValue = value; 
    } 
} 

private double? myValue; 
0

嗯,有你的財產的問題:

你必須使用一個支持字段,否則你不會能夠存儲/獲取您的價值。

您的代碼就變成了:

private double? _value; 
public double? Value 
{ 
    get 
    { 
     return _value.HasValue ? (double?)Math.Round(_value.Value, 1) : null; 
    } 
    set 
    { 
     _value = value; 
    } 
} 

你的異常會自行消失。

您的堆棧溢出異常來自Math.Round(Value.Value,1)。

您正試圖獲取您的財產的價值。所以,你打電話給你的getter來獲得這個值。然後,你再次打同一行,並再次調用Math.Round(Value.Value,1)。

然後,它再次調用getter,然後... 您會看到這一點。