【发布时间】:2018-09-10 19:07:44
【问题描述】:
我有这个代码:
void Foo<T>(T x) {} where T:class
interface IBar {}
IBar GetBar() {...}
尽管隐式类型约束设置为类,我仍然能够抽象调用并传递接口:
Foo<IBar>(GetBar());
为什么在这种情况下不强制类型约束?
但是,如果我使用这种结构:
void Doo<T>(T x) {
Foo<T>(x);
}
然后编译器会抛出一个错误并抱怨类型'T'必须是一个引用类型,这是预期的。
【问题讨论】:
-
在第二个构造中,你没有
where条件。 -
我认为这与装箱有关,我曾认为使用实现接口的结构会显示错误,但令人惊讶的是它没有。 This was unexpected,我猜
T被装箱为object(或其接口类型),然后满足where T : class约束。 -
@RonBeyer
IL_0009: ldloc.0 // myStructIL_000A: box UserQuery.MyStructIL_000F: call UserQuery+Program.Foo<IFace>似乎是对结构如何/为什么工作的正确评估。 -
@JonathonChase 谢谢,我没有去检查 IL,但它似乎很有可能。
-
因为你不能自己实例化一个接口。它必须是实现接口的类。所以这是有道理的。
标签: c# generics type-constraints