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