C#泛型:约束T,其中T:Object不';t编译;错误:约束不能是特殊类';对象';
当我使用:对象约束T时,如下所示:C#泛型:约束T,其中T:Object不';t编译;错误:约束不能是特殊类';对象';,c#,.net,generics,object,clr,C#,.net,Generics,Object,Clr,当我使用:对象约束T时,如下所示: public interface IDoWork<T> where T : Object { T DoWork(); } 公共接口i工作,其中T:Object { T道工(); } 我得到一个错误: 约束不能是特殊类“对象” 这是否意味着与以下内容存在隐含的差异 public interface IDoWork<T> // where T : Object { T DoWork(); } 公共接口IDoWork//
public interface IDoWork<T> where T : Object
{
T DoWork();
}
公共接口i工作,其中T:Object
{
T道工();
}
我得到一个错误:
约束不能是特殊类“对象”
这是否意味着与以下内容存在隐含的差异
public interface IDoWork<T> // where T : Object
{
T DoWork();
}
公共接口IDoWork//其中T:Object
{
T道工();
}
如果要将泛型类型约束为引用类型,请使用:class
public interface IDoWork<T> where T : class
{
T DoWork();
}
公共接口i工作,其中T:class
{
T道工();
}
这将禁止泛型类型成为值类型,例如
int
或结构。这两个约束之间没有区别,只是其中一个约束不允许用于显式声明
C#4.0语言规范(10.1.5类型参数约束)对此说明了两件事:
类型不能是对象。因为所有类型都派生自对象,
如果允许的话,这种限制将没有任何效果
如果T没有主约束或类型参数约束,则其
有效基类是对象
在您的评论中,您说您试图将T
设置为Void
类型Void
是一种特殊类型,表示没有返回类型,不能用来代替需要适当具体类型的T
。您必须创建一个无效的方法版本和一个T
版本(如果您想要两者)。根据C#4.0语言规范(编码:[10.1.5]类型参数约束)告诉我们两件事:
1] 类型不能是对象。因为所有类型都派生自对象,
如果允许,这样的限制将无效。2] 如果T没有主约束或类型参数约束,则其有效 基类是对象 定义泛型类时,可以对客户端代码在实例化类时可用于类型参数的类型应用限制。如果客户机代码试图使用约束不允许的类型实例化类,则结果是编译时错误。这些限制称为约束。通过使用where上下文关键字指定约束。 如果要将泛型类型约束为引用类型,请使用:class。 据 约束不能是特殊类“标识符”。以下类型不能用作约束:
- 系统对象
- 系统数组
- 系统代理
- 系统枚举
- System.ValueType
:Object
意味着他们试图约束到引用类型。@ThomasLevesque:在许多情况下,泛型代码可以与任何引用类型一起工作,但不能与任何泛型值类型一起工作;一个简单的例子是任何使用互锁的代码。CompareExchange
或其他使用互锁的泛型类的代码。struct
约束不是很有用,尽管它允许将类型用作可空的
。此外,在某些情况下,实现接口“正确”的值类型可能工作,但实现接口的类不可能工作。太棒了!正是我所寻找的:)限制引用类型的一个常见原因:当无法返回有效对象时,希望返回null
null
仅对引用类型有意义/有效。如果能解释为什么这些类型作为约束没有意义,以及如何取而代之,这个答案将非常有用。对于这样的问题,我没有答案,但这里有另一个与约束更多讨论相关的链接:@ToolmakerSteve我已经详细阐述了我的答案。不过,结构呢?我试着这样做是为了禁止大量不可为null的东西,比如“int”。