gpt4 book ai didi

c# - 为什么将泛型参数指定为接口(interface)不是类约束的错误?

转载 作者:太空狗 更新时间:2023-10-29 21:22:14 25 4
gpt4 key购买 nike

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

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

}

我可以通过指定接口(interface)类型来调用它,例如 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 时允许将接口(interface)指定为类型参数约束?

最佳答案

“类”约束实际上是一个“引用类型”约束——它不是具体的意思。 (它也适用于委托(delegate)类型。)来自 the MSDN page on generic type constraints :

The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

现在举个例子:

As you can see it completely avoids the generic constraint.

不,它没有。它使用 ICollection<int>作为类型参数,一个引用类型。请注意,由于装箱原因,您传递给方法的值一个引用。

关于c# - 为什么将泛型参数指定为接口(interface)不是类约束的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com