为什么&#39; Func <ibase>&#39;编译时&#39; Func <tgeneric>其中TGeneric:IBase&#39;没有按&#39;吨?

时间:2016-03-18 18:16:52

标签: c# generics inheritance delegates generic-programming

为什么下面的集团错了?

    public interface IBase { }
    public class ClassX : IBase
    {
    }

    public class ClassY
    {
        public static ClassX FunctionReturnX() { return new ClassX(); }
    }

    public class ClassZ<TGeneric> where TGeneric : IBase
    {
        Func<IBase> funcInterface = ClassY.FunctionReturnX; //Right

        Func<TGeneric> funcGeneric = ClassY.FunctionReturnX; //Wrong
    }

2 个答案:

答案 0 :(得分:1)

因为ClassX肯定是IBase,但它可能不是TGeneric,因为其他内容可以实现IBase并用于TGeneric

答案 1 :(得分:1)

总之,您无法将ClassX强制转换为任何实现IBase的类。您只能保证能够将其投射到IBase本身。考虑这个例子:

想象一下,你有一个类ClassA来实现IBase,如下所示:

public class ClassA : IBase
{

}

现在,ClassZ<ClassA>看起来像这样(这不是真正的代码):

public class ClassZ<ClassA>
{
    Func<IBase> funcInterface = ClassY.FunctionReturnX; //Right

    Func<ClassA> funcGeneric = ClassY.FunctionReturnX; //Wrong
}

ClassY.FunctionReturnX会返回ClassX,您可以将其转换为IBase,但不能将其投放到ClassA。因此,您会收到并发症错误。