gpt4 book ai didi

.net - 如何正确访问 C++/CLI initonly TimeSpan 字段?

转载 作者:行者123 更新时间:2023-12-02 00:50:56 27 4
gpt4 key购买 nike

以下代码编译时出现警告和智能感知错误:

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 的了解不够。它无法确保 getter 不会执行任何可能更改结构值的操作,从而使 initonly 合约无效。它通过复制结构并发出警告来解决这个问题,因为这可能是一个性能问题。这有点严厉,其他托管编译器在不做任何说明的情况下就进行了复制。我只是在其前面插入一个 #pragma warning(disable:4395) ,这样警告就会被抑制。

仅当我在 VS2012 中尝试此操作时,才会出现 IntelliSense 错误。这是一个错误。您可以在 connect.microsoft.com 上报告该问题。

考虑到痛苦,而且这似乎是一个私有(private)类(class)成员,我只是放弃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;
}
};

抖动优化器会消除它,所以不用担心开销。

关于.net - 如何正确访问 C++/CLI initonly TimeSpan 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13831773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com