2014-01-27 42 views
1

本文Valued Conversions通過凱夫林·海尼給出所謂的變體值類型功能的動機,以及一個C++實現的輪廓。這是一個很好的閱讀,它涵蓋了我希望在C#中可用的內容:一種可以保存不同值的不同的value-types是否可以創建變量值類型?

我一直沒能找到,雖然在C#這樣的事。 SO上的一些類似的問題有不令人滿意的答案和評論,比如「這可能不是你想要的」。這令我感到驚訝,因爲它看起來像通常需要的功能。亨尼的C++ boost::any類被廣泛使用。

是沒可能建立在C#中這個功能?


編輯:爲了迴應其中的一個答案,我不認爲泛型會做到這一點。使用泛型要求開發人員知道變量所持有的變量類型,並且該類型對於該變量也變得不可變。但我所說的Variant類型應該能夠擁有不同的類型。例如,函數Variant ReadValue()可以從文件中讀取條目,解析它,然後相應填充Variant值,然後將其返回。來電者事先不知道返回的Variant中包含哪種類型。

+2

只要將它聲明爲'Object'類型呢? – bhamlin

+0

@bhamlin會使用「對象」是適當的?我不知道,因爲我對C#相當陌生。這種方法聽起來過於通用,不過我喜歡,因爲'Object'基本上可以是任何東西,包括非值類型。 –

回答

4

這是仿製藥的用途。 List<T>其中T什麼都沒有。泛型提供編譯時和運行時類型安全。

你可以創建自己的泛型類型來存儲你想要的任何值。您也可以將任何東西投射到object並將其傳遞。

您還可以使用泛型約束來限制你的類型,如想只有T是引用類型:

public MyClass<T> where T : class 

還是值類型:

public MyClass<T> where T : struct 

查看更多在這裏: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

您不能將泛型類型限制爲'ValueType'。 – Servy

+0

@Servy:更好地表達爲'你的意思'結構'不''ValueType''。 – Magus

+0

謝謝@Servy和@Magus--糾正了我的錯誤,並忘記了這一點。我一直認爲你*可以*這樣做,因爲你可以通過'new()'限制參考類型 – Haney

1

你可以考慮使用dynamic對於這一點。

動態類型使得它發生的操作能夠繞過編譯時類型檢查。相反,這些操作在運行時解決。

在大多數情況下,動態類型的行爲與類型對象相似。但是,包含動態類型表達式的操作不會被編譯器解析或類型檢查。

0

海尼的文章是很老(2000年)。在現場課程中(倫敦DevWeek 2008),我記得他解釋了低耦合和實現OCP(開放閉合原理)的抽象(接口)。他非常喜歡泛型和更通用的接口。所以從概念上來說,這很可能是,正好是他那時寫的,儘管我必須承認我沒看過這篇文章。 C#泛型甚至比C++模板更健壯,你應該看看Covariance and Contravariance in Generics

在另一方面:

你不能做什麼用仿製藥variable arity templates,這已經可用於C和C++。

0

從我明白,在C使用any ++是與使用objectChangeType方法的組合在C#與來自和進入任何類型的具有用於自動轉換好的句法異常。沒有限制只適用於值類型。

相關問題