; //<<问题 }};
问题是:
警告C4395:‘ 系统 </跨度> :: TimeSpan :: Ticks :: get’:成员函数会在initonly数据成员’Test :: Delay’的副本上调用
智能感知 </跨度> :不允许获取initonly字段的地址
如何正确访问Ticks? 以下代码编译时带有警告和 智能感知 </跨度> 错误:
ref class Test { initonly static TimeSpan Delay = TimeSpan(1,1,1);
测试(){ long long ticks = Delay.Ticks
嗯,那是非常重要的失败鲸鱼。警告是准确的,编译器对TimeSpan :: Tick属性getter知之甚少。它无法确保getter不会执行任何可能会改变结构值的任何内容,从而使getless无效 initonly 合同。它通过制作结构的副本并对其进行警告来解决它,因为这是一个可能的性能问题。这有点笨拙,其他托管编译器制作副本时没有说任何关于它的内容。我只是偷了一个 #pragma warning(disable:4395) 在此之前,警告被抑制。
#pragma warning(disable:4395)
仅在我在VS2012中尝试此操作时才会出现IntelliSense错误。那是一个错误。您可以在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; } };
抖动优化器将摆脱它,所以不要担心开销。
感谢Hans Passant的解释,我现在对情况的理解要好得多
我刚遇到同样的问题。
我的解决方案是
也许这不是“最先进的”编码,但它工作正常,请参阅 这里 (VisualStudio2017仍然会暴露此行为/问题)