繁体   English   中英

为什么将泛型参数指定为接口不是带有类约束的错误?

[英]Why specifying a generic argument as interface is not an error with a class constraint?

如果我有这样的通用方法:

static void Foo<T>() where T : class
{

}

我可以通过指定接口类型来调用它,例如ICollection<int>

Foo<ICollection<int>>();

现在假设我有一个实现ICollection<int>

struct Bar : ICollection<int>

我不能将它明确指定为类型参数,但如果我有一个ICollection<int>类型的变量具有底层类型Bar ,并且我的泛型方法更改为采用类型为T的参数,我可以这样做:

static void Foo<T>(T arg) where T : class
{

}

ICollection<int> bar = new Bar();
Foo <ICollection<int>>(bar);

如您所见,它完全忽略了通用约束。 所以我的问题是为什么在我们有class约束时允许将接口指定为类型参数?

“类”约束实际上是一个“引用类型”约束 - 它并不特别指代类。 (它也适用于委托类型。)从泛型类型约束的MSDN页面

type参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型。

现在举个例子:

如您所见,它完全避免了通用约束。

不,不。 它使用ICollection<int>作为类型参数,这一个引用类型。 请注意,由于装箱,您传入方法的值参考。

从文档中

其中T:class => type参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型。

类型参数的约束

int是值类型,但ICollection<int>不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM