21

当我用 : Object 约束 T 时:

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

我得到错误:

约束不能是特殊类“对象”

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

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

3 回答 3

57

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

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

这将禁止泛型类型成为值类型,例如int或结构。

于 2012-05-17T23:15:49.093 回答
14

这两个约束之间没有区别,只是不允许明确说明无用。

C# 4.0 语言规范(10.1.5 类型参数约束)对此有两点说明:

类型不能是对象。因为所有类型都派生自对象,所以如果允许,这样的约束将不起作用。

...

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

在您的评论中,您说您试图使Ttype VoidVoid是一种特殊类型,表示没有返回类型,不能用来代替T,需要适当的具体类型。T如果您想要两者,则必须创建方法的无效版本和版本。

于 2012-05-17T23:32:06.677 回答
0

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

1] 类型不能是对象。因为所有类型都派生自对象,所以如果允许,这样的约束将不起作用。

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

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

根据MSDN

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

  • 系统对象
  • 系统数组
  • 系统委托
  • 系统枚举
  • 系统值类型。
于 2015-04-30T08:19:31.020 回答