【问题标题】:Generic types. There is no boxing conversion or type parameter conversion通用类型。没有装箱转换或类型参数转换
【发布时间】:2019-03-22 06:56:04
【问题描述】:

我的代码结构如下:

public interface ICode { }

public interface IPreparedCode<TCode>
    where TCode : ICode { }

public interface ILayer<TPreparedCode>
    where TPreparedCode : IPreparedCode<ICode> { }

public interface IContext<TCode, TPreparedCode, TLayer>
    where TCode : ICode
    where TPreparedCode : IPreparedCode<TCode>
    where TLayer : ILayer<TPreparedCode> { }

我有错误“没有从 TPreparedCode 到 IPreparedCode 的装箱转换或类型参数转换”。

【问题讨论】:

    标签: c# generics compiler-errors


    【解决方案1】:

    ILayer 的泛型参数被限制为IPreparedCode&lt;ICode&gt;,但您给它的泛型参数是TPreparedCode,它被限制为IPreparedCode&lt;TCode&gt;。注意到区别了吗? IPreparedCode&lt;TCode&gt; 无法转换为 IPreparedCode&lt;ICode&gt;

    要解决此问题,您可以向ILayer 添加一个额外的通用参数TCode,并将TPreparedCode 约束为IPreparedCode&lt;TCode&gt;。:

    public interface ICode { }
    
    public interface IPreparedCode<TCode>
        where TCode : ICode { }
    
    public interface ILayer<TPreparedCode, TCode>
        where TCode : ICode
        where TPreparedCode : IPreparedCode<TCode> { }
    
    public interface IContext<TCode, TPreparedCode, TLayer>
        where TCode : ICode
        where TPreparedCode : IPreparedCode<TCode>
        where TLayer : ILayer<TPreparedCode, TCode> { }
    

    【讨论】:

    • 但是TCodeICode 然后IPreparedCode&lt;TCode&gt; 等于IPreparedCode&lt;ICode&gt;。也许我要求太多了=D
    • @HHHack 好的,让我们退后一步。您是否同意不能将 List&lt;string&gt; 分配给 List&lt;object&gt; 类型的变量?
    • @Sweeper 可以,但需要使用协方差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2015-09-02
    • 2013-07-14
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多