通用类型。没有装箱转换或类型参数转换

时间:2019-03-22 06:56:04

标签: c# generics compiler-errors

我的代码结构如下:

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 的装箱转换或类型参数转换”。

1 个答案:

答案 0 :(得分:0)

ILayer的通用参数被约束为IPreparedCode<ICode>,但是您赋予它的通用参数是TPreparedCode,它被约束为IPreparedCode<TCode>。注意区别吗? IPreparedCode<TCode>无法转换为IPreparedCode<ICode>

要解决此问题,您可以在TCode上添加一个额外的通用参数ILayer,并将TPreparedCode约束在IPreparedCode<TCode>上。:

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> { }