2016-03-18 23 views
0

次のブロックが間違っているのはなぜですか?なぜ 'Func <IBase>'は 'Func <TGeneric> TGeneric:IBase'がコンパイルされないうちにコンパイルされますか?

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 
    } 

答えて

1

ClassXは、IBaseを実装するすべてのクラスにキャストできません。それをIBaseにキャストできることが保証されているだけです。

あなたはこのようなIBase実装するクラスClassA持っていることを想像して::(これは実際のコードではない)、このようになります。今

public class ClassA : IBase 
{ 

} 

ClassZ<ClassA>を:

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

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

この例を考えてみましょうClassY.FunctionReturnXIBaseにキャストできるClassXを返しますが、ClassAにキャストできません。したがって、複雑なエラーが発生します。

1

ClassXは間違いIBaseですが、何か他のものがIBaseを実装するかもしれないし、TGenericのために使用されるので、それはTGenericではないかもしれませんので。

関連する問題