如何正确访问c ++/CLI initonly TimeSpan字段?

Dmi*_*gin 10 .net c++-cli .net-4.0 visual-c++

以下代码编译警告和intellisense错误:

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

    Test() {
        long long ticks = Delay.Ticks; // << problem
    }
};
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 警告C4395:'System :: TimeSpan :: Ticks :: get':成员函数将在initonly数据成员'Test :: Delay'的副本上调用
  • IntelliSense:不允许获取initonly字段的地址

如何正确访问Ticks?

Han*_*ant 12

嗯,那是非常重要的失败鲸鱼.警告是准确的,编译器对TimeSpan :: Tick属性getter知之甚少.它无法确保getter不会执行任何可能会更改结构值的内容,从而使initonly契约无效.它通过制作结构的副本并对其进行警告来解决它,因为这是一个可能的性能问题.这有点笨拙,其他托管编译器制作副本时没有说任何关于它的内容.我只是#pragma warning(disable:4395)抢先一步,所以警告被压制了.

仅在我在VS2012中尝试此操作时才会出现IntelliSense错误.那是一个错误.您可以在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;
    }
};
Run Code Online (Sandbox Code Playgroud)

抖动优化器将摆脱它,所以不要担心开销.