是否可以创建变量值类型?

时间:2014-01-27 19:36:07

标签: c# variant

Kevlin Henney的论文Valued Conversions给出了所谓的变量值类型功能的动机,以及C ++实现的概述。这是一个很好的阅读,它涵盖了我希望在C#中提供的内容:一种可以保存不同value-types值的常规类型。

我在C#中找不到这样的东西。关于SO的一些类似的问题有不令人满意的答案和评论,如“这可能不是你想要的”。这让我感到惊讶,因为它看起来像是相当常见的功能。 Henney的C ++ boost::any类被广泛使用。

是否无法在C#中创建此功能?


编辑:回答其中一个答案,我不认为泛型可以做到这一点。使用泛型要求开发人员知道Variant变量所持有的值类型,并且该类型对于该特定Variant变量也变为不可变。但我所说的Variant类型应该能够容纳不同的类型。例如,函数Variant ReadValue()可以从文件中读取条目,解析它,相应地填充Variant值然后返回它。调用者事先不知道返回的Variant中将包含哪种类型。

4 个答案:

答案 0 :(得分:5)

这是泛型的用途。 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

答案 1 :(得分:2)

您也可以考虑使用dynamic

  

动态类型使其发生的操作可以绕过编译时类型检查。相反,这些操作在运行时解决。

     

在大多数情况下,类型动态的行为类似于对象。但是,包含dynamic类型表达式的操作不会被编译器解析或进行类型检查。

答案 2 :(得分:1)

亨尼的文章相当陈旧(2000年)。在现场课程(伦敦DevWeek 2008)中,我记得他解释了低耦合并实现了OCP(开放 - 封闭原则)的抽象(接口)。他非常喜欢泛型和更通用的界面。因此,从概念上讲,它很可能完全当时他所写的内容,尽管我必须承认我没有读过这篇文章。 C#泛型甚至比C ++模板更强大,你应该看看Covariance and Contravariance in Generics

另一方面说明:

对于泛型,你不能做的是variable arity templates,它们已经可用于C和C ++。

答案 3 :(得分:1)

据我所知,在C ++中使用any与在C#中使用objectChangeType方法的组合相同,除了具有从任何类型进入自动转换的良好语法之外。并且仅限于价值类型。