在我的API编码期间,我遇到了很多关于通用引用类型与通用值类型的差异的混淆.
伙计们,问题是这两种野兽之间在约束和功能(最重要/容易被忽视的)方面有什么不同:
class ReferenceGenericwhere ??? { }
和
struct ValueGeneric: where ??? { }
编辑只是为了澄清问题和我所追求的:我想知道你可以用通用引用类型做什么而不能用通用值类型...反之亦然
编辑#2进一步澄清:如果泛型类型是引用类型或值类型,那么如何限制T-是否存在关于如何约束每种类型的差异?
请注意,声明为结构的任何内容始终是值类型,声明为类的任何内容始终是引用类型.换句话说,List
仍然是一个引用类型,如果你有:
struct Foo{ T value; }
然后Foo
仍然是一个值类型.
至于你可以用泛型类型做什么- 它们实际上只是遵循值类型和引用类型的常规规则; 至于你可以用类型T
中的类型值做什么,这取决于是否/如何T
约束.它不会因为泛型类型本身是结构还是类而有所不同.
编辑:Sasha Nullable
在评论中提及.我不确定这里的"异常"是什么 - 除了Nullable
不满足" where T : struct
"或" where T : class
"约束.它仍然是一种价值类型(这是重点的一部分).
响应Edit2:您可以通过以下方式限制允许引用或值的类型:
参考:
class ReferenceGenericwhere T: class { }
值:
struct ValueGenericwhere T: struct { }
从MSDN上的以下页面 http://msdn.microsoft.com/en-us/library/d5x73970.aspx