为什么我必须转换为类型参数而不能使用约束类型?

时间:2014-04-25 11:43:39

标签: c# generics casting generic-variance

任何人都可以解释为什么我必须转换为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);
}

1 个答案:

答案 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>.StuffT需要

投射到as(或使用new Bar())也不合适 - 您无法将Other投射到as,如果您使用{{1}}您只需获得空引用。