Kevlin Henney的论文Valued Conversions给出了所谓的变量值类型功能的动机,以及C ++实现的概述。这是一个很好的阅读,它涵盖了我希望在C#中提供的内容:一种可以保存不同value-types值的常规类型。
我在C#中找不到这样的东西。关于SO的一些类似的问题有不令人满意的答案和评论,如“这可能不是你想要的”。这让我感到惊讶,因为它看起来像是相当常见的功能。 Henney的C ++ boost::any类被广泛使用。
是否无法在C#中创建此功能?
编辑:回答其中一个答案,我不认为泛型可以做到这一点。使用泛型要求开发人员知道Variant
变量所持有的值类型,并且该类型对于该特定Variant
变量也变为不可变。但我所说的Variant
类型应该能够容纳不同的类型。例如,函数Variant ReadValue()
可以从文件中读取条目,解析它,相应地填充Variant
值然后返回它。调用者事先不知道返回的Variant
中将包含哪种类型。
答案 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#中使用object
和ChangeType方法的组合相同,除了具有从任何类型进入自动转换的良好语法之外。并且仅限于价值类型。