2013-06-04 6 views
7

Ich habe eine C++/CLI-Klasse wie folgt aus:IntelliSense-Fehler: eine Referenz kann nicht an ein Initonly-Feld gebunden werden?

// 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; 
    } 
} 

Das Projekt kompiliert ohne Fehler oder Warnungen, aber die Linie m_ptr = IntPtr::Zero mit einem IntelliSense Fehler immer rot unterstrichen: „ein Verweis nicht auf eine initonly Feld gebunden werden kann ". Was gibt? Wie kann ich das loswerden?

Dies ist in Visual Studio 2012 Premium Edition, aber das Platform Toolset ist Visual Studio 2008 (v90).

Antwort

6

Nun, es ist ein Fehler im IntelliSense-Parser. Geschrieben von der Edison Design Group. Ziemlich berühmt für das Schreiben von C++ - Frontends, aber C++/CLI hat ihnen sicherlich ein Workout gegeben. Es hat Probleme mit initonly-Feldern im Allgemeinen (IntPtr :: Zero ist initonly), etwas Ähnliches here, aber nicht anders mit diesem Fehler verbunden. In C++ kein Äquivalent zu haben, kann ein wichtiger Faktor sein.

Mit Code wie diesem wird der Test nicht sehr weit gebracht, die Zuordnung ist völlig überflüssig. Die CLR garantiert bereits, dass alle Felder in einer verwalteten Klasse null initialisiert werden.

So Workaround # 1 ist nur die Zuweisung weglassen, es tut nichts nützliches.

Behelfslösung # 2 ist die Standard-C++ Konstruktor Initialisierung Syntax:

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

Behelfslösung # 3, Art und Weise am Ende der Liste ist es so zu initialisieren, das initonly Feld vermieden:

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

Aber ich würde sicherlich # 1 empfehlen.

+0

Sind Zeigerfelder (nicht IntPtr, echte Zeiger) auch Null-initialisiert? – Asik

+1

Ja, sie sind in dieser Hinsicht nicht besonders. –

Verwandte Themen