为什么下面的集团错了?
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
}
答案 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
。因此,您会收到并发症错误。