我有一个像这样的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;
    }
}

项目编译时没有错误或警告,但是m_ptr = IntPtr::Zero行始终带有红色底线并带有IntelliSense错误:“引用不能绑定(bind)到initonly字段”。是什么赋予了?我该如何摆脱呢?

这是Visual Studio 2012 Premium Edition中的版本,但平台工具集是Visual Studio 2008(v90)。

最佳答案

好吧,这是IntelliSense解析器中的错误。由爱迪生设计小组撰写。以编写C++前端而闻名,但是C++/CLI确实给了他们锻炼的机会。通常,它对initonly字段有麻烦(IntPtr::Zero是initonly),类似于here,但与此错误无关。 C++中没有任何等效项可能是一个促成因素。

这样的代码并不需要太多测试,分配是完全多余的。 CLR已经做出了硬保证,即托管类中的所有字段都将被初始化为零。

因此,解决方法1是忽略分配,它没有任何用处。

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

   MyClass::MyClass() : m_ptr(IntPtr::Zero) {}

解决方法#3,位于列表底部的方法是像这样初始化它,避免使用initonly字段:
MyClass::MyClass() {
    m_ptr = IntPtr();
}

但我当然会推荐#1。

关于.net - IntelliSense错误: a reference cannot be bound to an initonly field?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16920005/

10-12 18:20