2013-06-04 47 views
7

我有一個C++/CLI類是這樣的:智能感知錯誤:引用無法綁定到initonly字段?

// 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總是強調紅色與智能感知錯誤:「引用不能綁定到一個initonly場」。是什麼賦予了?我怎樣才能擺脫這一點?

這是在Visual Studio 2012 Premium Edition中,但平臺工具集是Visual Studio 2008(v90)。

回答

6

嗯,這是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。

+0

指針字段(不是IntPtr,實數指針)是否也是零初始化的? – Asik

+1

是的,它們在這方面並不特別。 –