当我约束T搭配:对象是这样的:
public interface IDoWork<T> where T : Object
{
T DoWork();
}
我得到的错误:
约束不能特殊类“对象”
这是否意味着存在与不编译下面的一个隐含的区别?
public interface IDoWork<T> // where T : Object
{
T DoWork();
}
当我约束T搭配:对象是这样的:
public interface IDoWork<T> where T : Object
{
T DoWork();
}
我得到的错误:
约束不能特殊类“对象”
这是否意味着存在与不编译下面的一个隐含的区别?
public interface IDoWork<T> // where T : Object
{
T DoWork();
}
还有不同的是一个两个约束条件之间没有区别,是不允许被用于没用明确规定。
在C#4.0语言规范(10.1.5类型参数约束)称,此两件事情:
该类型一定不能是object。 由于所有类型都派生自object,这样的约束没有任何作用,如果它被允许。
...
如果T没有主要约束或类型参数约束,其有效基类为对象。
在你的评论,你说你试图让T
是类型的Void
。 Void
是一种特殊类型,指出没有返回类型,不能代替使用T
,这需要一个适当的具体类型。 你将不得不创建方法和无效版本T
,如果你希望两个版本。
如果要约束泛型类型是引用类型,使用: class
。
public interface IDoWork<T> where T : class
{
T DoWork();
}
这将从一个值类型,如禁止一般类型int
或一个结构。
按C#4.0语言规范(编码:[10.1.5]类型参数约束)告诉两件事情:
1]类型不能为对象。 由于所有类型都派生自object,这样的约束没有任何作用,如果它被允许。
2]如果T没有主要约束或类型参数约束,其有效基类为对象。
当你定义一个泛型类,你可以申请限制于种,当它实例化类的客户端代码可以使用类型参数的类型。 如果客户端代码试图使用不被约束所允许的类型来实例化类,结果是一个编译时错误。 这些限制是所谓的约束。 约束是通过使用其中上下文关键字指定。 如果要约束泛型类型是引用类型,使用:类。
根据MSDN
约束不能特殊类“标识”。 下列类型可能不被用作约束: