2013-08-22 48 views
3

我在this SO question 描述的問題在我的情況,不過可選的PARAM默認值是一個類似的問題:
1.定義在一個單獨的C++/CLI DLL。
2.已經在該lib中定義爲「public static const」
當我嘗試使用該值作爲C#中的默認參數值時,我得到「必須是編譯時間常量」。
有沒有辦法共享(C++/cli)庫和(C#)應用程序之間的常見常量值?可選參數「必須是一個編譯時間常數」

C++/CLI lib目錄下:

namespace MyCPlusPlusCLILib { 
    public ref class CPPCLIClass { 
    public: 
     static const double Invalid = -1; 
} 

C#代碼:

public MyMethod(double fish = MyCPlusPlusCLILib.CPPCLIClass.Invalid) { } 
// C# compiler error "Must be a compile time const" 

OR

const double MyConstDouble = MyCPlusPlusCLILib.CPPCLIClass.Invalid; 
// C# compiler error "Must be a compile time const" 
+0

參數是什麼類型? –

+0

@ChrisMantle double – Ricibob

+1

請過帳一些代碼。 – nvoigt

回答

8

常量關鍵字在C++中聲明是不是所有的常量,就可以任意地拋棄用的const_cast <>常數。

您需要使用C++/CLI特定關鍵字來聲明.NET常量,它的值存儲在元數據中,但不具有底層存儲。使用文字關鍵字:

literal double Invalid = -1; 

解決了您的問題,C#編譯器很樂意這麼做的。請注意公共常量的含義。您的C#編譯器將直接將該值編譯到生成的IL中,並用文字值替換「無效」。當你更新你的C++/CLI程序集時,如果修改了字面值,但不重新編譯C#代碼,那麼這種情況會變得很糟糕。公共常量對於常量常量是可以的,比如Math :: Pi。

+0

const,只讀,文字...寵壞了選擇。這確實是我正在尋找的解決方案。在這種情況下,我們理解並接受了這種情況(C++代碼是由固件代碼構成的 - 不會急於改變)。謝謝。 – Ricibob

+0

不,您不能使用'const_cast'從聲明爲'const'的對象中刪除'const'。 C#'const'更類似於C++'constexpr'。在對象上使用的C++'const'(不是指針或引用的目標類型)意味着該值在初始化後不能改變,但是可以從運行時變量計算初始(和永久)值。 C++'const'(同樣,在一個對象上,而不是句柄的目標類型)對應於不變性。 –

1

MyCPlusPlusCLILib.CPPCLIClass.Invalid是不是編譯時間常數,因爲你可以把不同版本MyCPlusPlusCLILib,其中Invalid設置爲不同的值。

如果您不希望將C#方法的默認值設置爲明確的-1,那麼可以這樣做:爲C#默認值選擇一個不同的值,當您獲取該值時,請在C++/CLI Invalid

public void MyMethod(double fish = Double.NaN) 
{ 
    if (Double.IsNaN(fish)) 
     fish = MyCPlusPlusCLILib.CPPCLIClass.Invalid; 

    ... 
} 
+0

那麼有沒有解決這個問題的方法。我想在C++/Cli和C#代碼之間共享一個無效值 - 這可能嗎? – Ricibob

+0

請參閱編輯。無法直接共享該值,但可以使用一個默認值觸發另一個值的使用。 –

+0

這是一個解決方案+1 - 我認爲我認爲它不會遭受漢斯解決方案的困惑 - 因爲如果更新了lib,舊的尖銳代碼仍然會從lib中提取新的lib值。但在這種特殊情況下,我可以忍受虛無,文字更清潔。謝謝。 – Ricibob

相關問題