2012-12-12 17 views
9

下面的代碼編譯有警告和智能錯誤:如何正確訪問C++/CLI initonly TimeSpan字段?

ref class Test { 
    initonly static TimeSpan Delay = TimeSpan(1,1,1); 

    Test() { 
     long long ticks = Delay.Ticks; // << problem 
    } 
}; 

的問題是:

  • 警告C4395: '系統::時間跨度::蜱::得到':成員函數 是調用的initonly數據成員「測試::延遲」
  • 智能感知的副本:服用initonly場的地址是不允許

如何正確訪問Ticks?

回答

11

嗯,這是非常重大的失敗鯨。該警告是準確的,編譯器對TimeSpan :: Tick屬性獲取器不夠了解。它不能保證吸氣不會做任何可能改變結構的價值,從而無效的initonly合同。它通過製作一個結構體的副本來解決它,並警告它,因爲這是一個可能的性能問題。這有點笨手笨腳,其他受管理的編譯器製作副本時沒有提及任何有關它的信息。我只是在它之前跳過#pragma warning(disable:4395),這樣警告就被壓制了。

智能感知錯誤只當我嘗試這個在VS2012出現。這是一個錯誤。你可以在connect.microsoft.com上報告它。

鑑於不幸,並且這看起來像是一名私人班級成員,我只想從開始以取得成功。如果這是不可取的,那麼你可以用一個屬性包裝領域,有意創建副本,從而擺脫這兩個問題,是這樣的:

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

抖動優化器將擺脫它,所以不用擔心關於開銷。

+0

此警告仍然存在於VS2015。 – shoelzer