C#泛型:约束其中T:对象不编译; 错误:约束不能特殊类“对象”(C# Generics: Co

2019-07-29 11:19发布

当我约束T搭配:对象是这样的:

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

我得到的错误:

约束不能特殊类“对象”

这是否意味着存在与不编译下面的一个隐含的区别?

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

Answer 1:

还有不同的是一个两个约束条件之间没有区别,是不允许被用于没用明确规定。

在C#4.0语言规范(10.1.5类型参数约束)称,此两件事情:

该类型一定不能是object。 由于所有类型都派生自object,这样的约束没有任何作用,如果它被允许。

...

如果T没有主要约束或类型参数约束,其有效基类为对象。

在你的评论,你说你试图让T是类型的VoidVoid是一种特殊类型,指出没有返回类型,不能代替使用T ,这需要一个适当的具体类型。 你将不得不创建方法和无效版本T ,如果你希望两个版本。



Answer 2:

如果要约束泛型类型是引用类型,使用: class

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

这将从一个值类型,如禁止一般类型int或一个结构。



Answer 3:

按C#4.0语言规范(编码:[10.1.5]类型参数约束)告诉两件事情:

1]类型不能为对象。 由于所有类型都派生自object,这样的约束没有任何作用,如果它被允许。

2]如果T没有主要约束或类型参数约束,其有效基类为对象。

当你定义一个泛型类,你可以申请限制于种,当它实例化类的客户端代码可以使用类型参数的类型。 如果客户端代码试图使用不被约束所允许的类型来实例化类,结果是一个编译时错误。 这些限制是所谓的约束。 约束是通过使用其中上下文关键字指定。 如果要约束泛型类型是引用类型,使用:类。

根据MSDN

约束不能特殊类“标识”。 下列类型可能不被用作约束:

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


文章来源: C# Generics: Constraining T where T : Object doesn't compile; Error: Constraint cannot be special class 'object'