7

我有一个像这样的 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 错误:“引用不能绑定到 initonly 字段”。是什么赋予了?我怎样才能摆脱这个?

这是在 Visual Studio 2012 高级版中,但平台工具集是 Visual Studio 2008 (v90)。

4

1 回答 1

6

嗯,这是 IntelliSense 解析器中的一个错误。由爱迪生设计集团撰写。以编写 C++ 前端而闻名,但 C++/CLI 确实给了他们锻炼机会。它通常在 initonly 字段上存在问题(IntPtr::Zero 是 initonly),此处类似但与此错误无关。在 C++ 中没有任何等价物很可能是一个促成因素。

像这样的代码并没有得到太多的测试,分配是完全多余的。CLR 已经硬保证托管类中的所有字段都是零初始化的。

所以解决方法#1 只是省略分配,它没有做任何有用的事情。

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

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

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

MyClass::MyClass() {
    m_ptr = IntPtr();
}

但我肯定会推荐#1。

于 2013-06-04T18:55:22.650 回答