2011-12-23 184 views
2

我有一個C++/CLI包裝類來在C#和本地C++之間進行互操作。我收到一個與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?可以解決它,但是我錯誤的是,當我將可空作爲參考定義時,它說System.ValueType。我可以離開演員繼續前進,還是我做錯了什麼?

+2

'可爲空'是一個值類型,而不是引用類型。 – 2011-12-23 12:36:56

+1

我對託管C++一無所知,但您確定需要'gcnew'嗎? '可爲空'是一個值類型,而不是引用類型。 'gcnew'盒子,還是隻適用於參考類型? – 2011-12-23 12:38:24

+3

@ LasseV.Karlsen在C++/CLI中,您可以使用裝箱值類型(強制類型化)轉換爲「System.ValueType」(它是一個引用類型)和一些元數據。 – CodesInChaos 2011-12-23 12:43:02

回答

6

您正在使用Nullable<int>^這是一個參考。由於運行時不直接支持值類型的引用,因此IL級別的實際類型爲ValueType,它以C++/CLI支持的方式標記爲Nullable<int>^,但C#不支持。對於C#,只需鍵入爲System.ValueType

由於可空字符被作爲其基礎類型裝箱,所以這使得可空字符比正常值類型更不明顯。

我建議不要在C++中聲明該字段爲引用,但要使用簡單的Nullable<int>

相關問題