为什么 '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
。因此,你会得到复杂的错误。
为什么下面的方块是错误的?
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
。因此,你会得到复杂的错误。