Dot-Net
如何正確訪問 c++/CLI initonly TimeSpan 欄位?
以下程式碼編譯時出現警告和智能感知錯誤:
ref class Test { initonly static TimeSpan Delay = TimeSpan(1,1,1); Test() { long long ticks = Delay.Ticks; // << problem } };問題是:
- 警告 C4395:“System::TimeSpan::Ticks::get”:將在 initonly 數據成員“Test::Delay”的副本上呼叫成員函式
- IntelliSense:不允許獲取 initonly 欄位的地址
如何正確訪問 Ticks?
嗯,這是相當大的失敗鯨魚。警告是準確的,編譯器對 TimeSpan::Tick 屬性獲取器的了解不夠。它不能確保 getter 不做任何可能改變結構值的事情,從而使initonly契約無效。它通過複製結構並警告它來解決它,因為這可能是一個性能問題。這有點笨拙,其他託管編譯器製作副本而不說任何內容。我只是
#pragma warning(disable:4395)在它前面放了一個,所以警告被抑制了。IntelliSense 錯誤僅在我在 VS2012 中嘗試時出現。那是一個錯誤。您可以在 connect.microsoft.com 上報告它。
考慮到痛苦並且這似乎是一個私人班級成員,我只會放棄initonly以取得成功。如果這不是可取的,那麼您可以用屬性包裝該欄位,故意創建副本,從而擺脫這兩個問題,如下所示:
ref class Test { initonly static TimeSpan _delay = TimeSpan(1,1,1); static property TimeSpan Delay { TimeSpan get() { return _delay; } } Test() { long long ticks = Delay.Ticks; } };抖動優化器將擺脫它,所以不用擔心成本。