为什么 'Func<IBase>' 编译而 'Func<TGeneric> where TGeneric : IBase' 不编译?

Why does 'Func<IBase>' compile while 'Func<TGeneric> where TGeneric : IBase' doesn't?

为什么下面的方块是错误的?

    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
    }

因为 ClassX 肯定是 IBase,但它可能不是 TGeneric,因为其他东西可能会实现 IBase 并用于 TGeneric

总而言之,您不能将 ClassX 转换为任何实现 IBase 的 class。您只能保证能够将其转换为 IBase 本身。考虑这个例子:

想象一下,您有一个 class 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 returns ClassX 可以转换为 IBase,但不能转换为 ClassA。因此,你会得到复杂的错误。