2016-03-18 36 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本身。考慮下面這個例子:

假設你有一個類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。因此,您會收到併發症錯誤。

1

因爲ClassX絕對是一個IBase,但它可能不是TGeneric因爲別的東西有可能實現IBase,並用於TGeneric

相關問題