Dot-Net

如何正確訪問 c++/CLI initonly TimeSpan 欄位?

  • September 3, 2018

以下程式碼編譯時出現警告和智能感知錯誤:

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

抖動優化器將擺脫它,所以不用擔心成本。

引用自:https://stackoverflow.com/questions/13831773