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

goo*_*ate 19 .net c# generics clr object

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

public interface IDoWork<T> where T : Object
{
    T DoWork();
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

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

public interface IDoWork<T> // where T : Object
{
    T DoWork();
}
Run Code Online (Sandbox Code Playgroud)

Dou*_*las 52

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

public interface IDoWork<T> where T : class
{
    T DoWork();
}
Run Code Online (Sandbox Code Playgroud)

这将禁止泛型类型为值类型,例如int结构.

  • 我不知道接口的用途是什么,但禁止值类型似乎很奇怪......返回int或bool的任务相当常见. (4认同)
  • 你的观点是有效的,但我不知道OP的意图是什么.我假设`:Object`意味着他们试图约束引用类型. (2认同)
  • @ThomasLevesque:在许多情况下,通用代码可以与任何引用类型一起使用,但不能与任何通用值类型一起使用; 一个简单的例子是使用`Interlocked.CompareExchange`或其他使用泛型类的代码.`struct`约束并不是那么有用,尽管它允许将一个类型用作`Nullable <T>`.此外,在某些情况下,实现"正确"接口的值类型可能有效,但实现接口的类不可能工作. (2认同)

Chr*_*non 15

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

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

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

...

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

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