代码之家  ›  专栏  ›  技术社区  ›  anonymous

与接口列表的接口

  •  3
  • anonymous  · 技术社区  · 16 年前

    我有:

    public interface IRequest
    {
        IList<IRequestDetail> Details { get; set; }
    
        // stuff
    }
    
    public interface IRequestDetail
    {
        // stuff
    }
    

    public class MyRequest : IRequest
    {
        IList<MyRequestDetail> Details {get; set; }
    
        // stuff
    }
    
    public class MyRequestDetail : IRequestDetail
    {
        // stuff
    }
    

    它不起作用。

    C#对我很生气,因为我的请求没有实现接口,因为没有IRequestDetail的IList。

    现在,如果我更改它,使细节是IRequestDetail的IList,那么我必须在代码中的任何地方将其转换为MyRequestDetail,我使用的是非接口成员(我有几个共享公共内容的请求,但随后专门化)。

    我有点理解为什么它是错的,但还没有完全理解!

    3 回复  |  直到 16 年前
        1
  •  17
  •   Michael Meadows    8 年前

    我认为,基于这样一个问题,问题在于您希望将详细信息视为一个通用列表,并强制它实现IRequestDetail。您还希望为实现类更具体地键入它。在这种情况下,您需要使IRequest成为通用的。

    public interface IRequest<T> where T : IRequestDetail
    {
        IList<T> Details { get; set; }
    
        // stuff
    }
    
    public class MyRequest : IRequest<MyRequestDetail>
    {
        public IList<MyRequestDetail> Details {get; set; }
    
        // stuff
    }
    

    这应该对你有用。

    编辑2017-03-17

    public interface IRequestDetail
    {
    
    }
    
    public class MyRequestDetail : IRequestDetail
    {
    
    }
    
    public interface IRequest<T> where T : IRequestDetail
    {
        IList<T> Details { get; set; }
    
        // stuff
    }
    
    public class MyRequest<T> : IRequest<T>
        where T : IRequestDetail
    {
        public IList<T> Details { get; set; }
    
        // stuff
    }
    
    public class Consumer
    {
        public void MyFunction<T>(IRequest<T> request)
            where T : IRequestDetail
        {
    
        }
    
        public void Foo()
        {
            var test = new MyRequest<MyRequestDetail>();
            MyFunction(test);
        }
    }
    
        2
  •  2
  •   cRichter    16 年前

    准确的 迈克尔有解决办法。

    IList<MyRequestDetail>
    

    IList<IRequestDetail>
    

        3
  •  0
  •   Reed Copsey    16 年前

    这是由于C#中的协方差和逆方差造成的。有一个非常详细,非常清楚的问题解释(分为许多部分)上 Eric Lippert's Blog