Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型:约束T,其中T:Object不';t编译;错误:约束不能是特殊类';对象';_C#_.net_Generics_Object_Clr - Fatal编程技术网

C#泛型:约束T,其中T:Object不';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//

当我使用:对象约束T时,如下所示:

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

所有C#类都是object的子类。这样的约束有点奇怪:)不管它值多少钱,我试图让T==Object==Void,就像在这个问题中一样:这个约束是多余的,因为这是默认的……请看这里可能的约束:@Artem Chilin Correct。所有的课程都是。但是,并非所有类型(例如:接口)。但是,运行时的对象必须是从System.object继承的类型的实例。我不知道该接口用于什么,但禁止值类型似乎很奇怪。。。返回int或bool的任务相当常见。你的观点是正确的,但我也不知道OP的意图是什么。我假设
:Object
意味着他们试图约束到引用类型。@ThomasLevesque:在许多情况下,泛型代码可以与任何引用类型一起工作,但不能与任何泛型值类型一起工作;一个简单的例子是任何使用
互锁的代码。CompareExchange
或其他使用互锁的泛型类的代码。
struct
约束不是很有用,尽管它允许将类型用作
可空的
。此外,在某些情况下,实现接口“正确”的值类型可能工作,但实现接口的类不可能工作。太棒了!正是我所寻找的:)限制引用类型的一个常见原因:当无法返回有效对象时,希望返回
null
null
仅对引用类型有意义/有效。如果能解释为什么这些类型作为约束没有意义,以及如何取而代之,这个答案将非常有用。对于这样的问题,我没有答案,但这里有另一个与约束更多讨论相关的链接:@ToolmakerSteve我已经详细阐述了我的答案。不过,结构呢?我试着这样做是为了禁止大量不可为null的东西,比如“int”。