C#generics:约束T,其中T:Object不编译; 错误:约束不能是特殊类’对象’

当我约束T:对象像这样:

public interface IDoWork where T : Object { T DoWork(); } 

我收到错误:

约束不能是特殊类’对象’

这是否意味着与编译的以下内容存在隐含的差异?

 public interface IDoWork // where T : Object { T DoWork(); } 

两个约束之间没有区别,除了不允许显式声明无用之外。

C#4.0语言规范(10.1.5类型参数约束)说明了两件事:

类型不能是对象。 因为所有类型都是从对象派生的,所以如果允许这样的约束就没有效果。

如果T没有主要约束或类型参数约束,则其有效基类是object。

在你的评论中,你说你试图让T成为Void类型。 Void是一种特殊类型,表示没有返回类型,不能用于代替T ,这需要适当的具体类型。 如果需要,您将必须创建方法的void版本和T版本。

如果要将generics类型约束为引用类型,请使用: class

 public interface IDoWork where T : class { T DoWork(); } 

这将禁止generics类型为值类型,例如int或struct。

根据C#4.0语言规范(编码:[10.1.5]类型参数约束)说明两件事:

1]类型不能是对象。 因为所有类型都是从对象派生的,所以如果允许这样的约束就没有效果。

2]如果T没有主要约束或类型参数约束,则其有效基类是object。

定义generics类时,可以对客户端代码在实例化类时可用于类型参数的类型类型应用限制。 如果客户端代码尝试使用约束不允许的类型来实例化您的类,则结果是编译时错误。 这些限制称为约束。 使用where contextual关键字指定约束。 如果要将generics类型约束为引用类型,请使用:class。

根据MSDN

约束不能是特殊类’标识符’。 以下类型不能用作约束:

  • System.Object的
  • 的System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType。