【发布时间】:2011-12-02 01:09:30
【问题描述】:
这是 C# 中泛型类或方法中的“结构”限制。我想知道它仅表示结构或从值类型派生的任何类型,如 int、double、enum、ant 等。下一个代码可以让我使用简单类型吗?
class SomeGenericClass <T> where T : struct
{
//some inplementation
}
【问题讨论】:
标签: c# .net generics restrictions
这是 C# 中泛型类或方法中的“结构”限制。我想知道它仅表示结构或从值类型派生的任何类型,如 int、double、enum、ant 等。下一个代码可以让我使用简单类型吗?
class SomeGenericClass <T> where T : struct
{
//some inplementation
}
【问题讨论】:
标签: c# .net generics restrictions
这意味着T 只能是值类型。值类型只是那些用struct关键字和enum关键字定义的数据结构。
例如,
struct A{}; //value-type
struct B{}; //value-type
class C{}; //reference-type
enum D {}; //value-type
SomeGenericClass<A> a; //ok
SomeGenericClass<B> b; //ok
SomeGenericClass<C> c; //compilation error - C is not value type
SomeGenericClass<D> d; //ok
至于int、double、float等内置类型,都是值类型。这些关键字中的每一个都对应于框架中定义的结构。比如int基本上就是System.Int32,double就是System.Double,以此类推。
【讨论】:
“结构”限制是什么意思?
表示任何不可为空的值类型。所有结构都是值类型。
我想知道它仅表示结构或任何从值类型派生的类型,如 int、double、enum、ant 等。下一个代码可以让我使用简单类型吗?
您所谓的“简单类型”,例如 int、double 和 enum 只不过是对应于 System.Int32 和 System.Double 结构的 C# 关键字,以及 System.Enum 类基于System.ValueType(这使得枚举也是值类型,尽管Enum 本身就是一个类)。
因此,这些类型也满足where T : struct 约束,以及常规结构。
【讨论】:
取自C# language specification 第 4.1.10 章:
相反,不可为空的值类型是除 System.Nullable 及其简写 T 之外的任何值类型? (对于任何 T),加上任何被约束为不可为空值类型的类型参数(即任何具有 结构约束的类型参数)。 p>
是的,这基本上意味着 T 仅限于值类型,而不是引用类型。
【讨论】: