任何人都可以解释为什么我必须转换为T以及为什么Add2不接受Bar作为参数?
class Foo<T> where T : class, IBar
{
void Add1(IDo<T> @do) { @do.Stuff(new Bar() as T); }
// Add2 does not compile:
// Argument type Bar is not assignable to parameter Type T
void Add2(IDo<T> @do) { @do.Stuff(new Bar()); }
}
interface IBar {}
class Bar : IBar {}
interface IDo<in T> {
void Stuff(T bar);
}
答案 0 :(得分:6)
可能不合适。例如,考虑:
class Other : Bar {}
...
IDo<Other> do = new DoImpl<Other>();
Foo<Other> foo = new Foo<Other>();
foo.Add2(do);
使用您当前的代码,这将调用do.Add2(new Bar())
... Bar
显然无效Other
IDo<Other>.Stuff
,T
需要
投射到as
(或使用new Bar()
)也不合适 - 您无法将Other
投射到as
,如果您使用{{1}}您只需获得空引用。