我有一个像这样的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 Premium Edition中,但Platform Toolset是Visual Studio 2008(v90)。
答案 0 :(得分:6)
嗯,这是IntelliSense解析器中的一个错误。由爱迪生设计集团撰写。以编写C ++前端而闻名,但C ++ / CLI确实为他们提供了锻炼。一般来说,initonly字段有问题(IntPtr :: Zero是initonly),类似于here,但与此bug无关。在C ++中没有任何等价物可能是一个促成因素。
它没有像这样的代码进行测试,分配完全是多余的。 CLR已经很难保证托管类中的所有字段都是零初始化的。
所以解决方法#1只是省略了作业,它没有做任何有用的事情。
解决方法#2是使用标准C ++构造函数初始化语法:
MyClass::MyClass() : m_ptr(IntPtr::Zero) {}
解决方法#3,列表底部的方法是像这样初始化它,避免 initonly 字段:
MyClass::MyClass() {
m_ptr = IntPtr();
}
但我当然建议#1。