IntelliSense错误:引用无法绑定到initonly字段?

Asi*_*sik 7 .net c++-cli

我有一个像这样的C++/CLI类:

// MyClass.h
#pragma once

namespace MyNamespace {
    using namespace System;

    public ref class MyClass {
    private:
        MyClass();
        IntPtr m_ptr;
    };
}

// MyClass.cpp
#include "MyClass.h"
using namespace System;

namespace MyNamespace {
    MyClass::MyClass() {
        m_ptr = IntPtr::Zero;
    }
}
Run Code Online (Sandbox Code Playgroud)

项目编译时没有错误或警告,但是该行m_ptr = IntPtr::Zero总是带有下划线红色,并带有IntelliSense错误:"引用不能绑定到initonly字段".是什么赋予了?我怎么能摆脱这个?

这是在Visual Studio 2012 Premium Edition中,但Platform Toolset是Visual Studio 2008(v90).

Han*_*ant 6

嗯,这是IntelliSense解析器中的一个错误.由爱迪生设计集团撰写.以编写C++前端而闻名,但C++/CLI确实为他们提供了锻炼.一般来说,initonly字段有问题(IntPtr :: Zero是initonly),类似于此处,但与此bug无关.在C++中没有任何等价物可能是一个促成因素.

它没有像这样的代码进行测试,分配完全是多余的.CLR已经很难保证托管类中的所有字段都是零初始化的.

因此,解决方法#1只是省略了赋值,它没有做任何有用的事情.

解决方法#2是使用标准C++构造函数初始化语法:

   MyClass::MyClass() : m_ptr(IntPtr::Zero) {}
Run Code Online (Sandbox Code Playgroud)

解决方法#3,列表底部的方法是像这样初始化它,避免initonly字段:

MyClass::MyClass() {
    m_ptr = IntPtr();
}
Run Code Online (Sandbox Code Playgroud)

但我肯定会推荐#1.