2011-12-23 33 views
2

C#とネイティブC++を相互運用するためのC++/CLIラッパークラスがあります。 System.Nullableに関連した奇妙なエラーが発生しています。私は、基本的なタイプの場合、System.Nullable<T>T?に相当することを理解しています。'System.ValueType'型を暗黙的に 'int?'に変換できません。

のC#:

public int? RoboticsArmRotation { 
    get { return mRobotics.ArmRotation; } 
} 

C++/CLI、インターフェース:

virtual property System::Nullable<int>^ ArmRotation{ System::Nullable<int>^ get() = 0; } 

は、C++/CLI、具象クラス:だから私はこれを行う

virtual property System::Nullable<int>^ ArmRotation { 
    System::Nullable<int>^ get() { 
     boost::optional<int> value = m_pNativeInstance->getArmRotation(); 
     return value.is_initialized()? gcnew System::Nullable<int>(value.get()) : gcnew System::Nullable<int>(); 
    } 
} 

をしかし、私はタイトルのを取得しますコンパイルエラー。 int?にキャスティングすると解決しますが、nullableを参照として定義したときにはSystem.ValueTypeと言っています。キャストを離れることができますか?何か間違っていますか?

+2

'Nullable 'は値型であり、参照型ではありません。 –

+1

私は管理されたC++については何も知りませんが、 'gcnew'が必要ですか? 'Nullable 'は値型であり、参照型ではありません。 'gcnew'ボックスが表示されるのでしょうか、それとも参照型に対してのみ機能しますか? –

+3

@ LasseV.Karlsen C++/CLIでは、ボックス型の値型で強く型付けされた方法で作業できます。これは 'System.ValueType'(参照型)といくつかのメタデータに変換されます。 – CodesInChaos

答えて

6

Nullable<int>^を参考にしています。値型の参照はランタイムによって直接サポートされていないため、ILレベルの実際の型はValueTypeであり、C++/CLIがサポートする方法でNullable<int>^とタグ付けされていますがC#ではサポートされません。 C#の場合、ちょうどSystem.ValueTypeとタイプされています。

これは、NULL値が通常の値型よりも意味をなさないことになります。

フィールドをC++での参照として宣言しないでくださいが、単純なNullable<int>を使用することをお勧めします。

関連する問題