无法转换为&#39; SpecificComponent&#39;到&#39; IComponent <icomponentguid>&#39; </icomponentguid>

时间:2014-03-13 13:50:29

标签: c# oop generics inheritance

我是这个班级结构:

namespace ClassLibrary1
{
    public interface IComponentGuid { }

    class ComponentGuid : IComponentGuid{}

    internal interface IComponent<T> where T : IComponentGuid {
         List<T> List();
     }

    class SpecificComponent : IComponent<ComponentGuid> { 
      public List<ComponentGuid> List()
      {
          throw new System.NotImplementedException();
       }
    }

    class P
    {
        public P(IComponent<IComponentGuid> pComponent) { }
    }


    class Caller
    {
        public Caller()
        {
            var specific = new SpecificComponent();

            var p = new P(specific);
            }
    }
}

问题出现了实例化P:var p = new P(specific);

我得到了

cannot convert from 'ClassLibrary1.SpecificComponent' to 'ClassLibrary1.IComponent<ClassLibrary1.IComponentGuid>'

我做错了什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

如果您在界面上放弃List<T>并将其替换为IEnumerable<T>的共同变体界面,然后将您的类型参数变为共变体,则可以使其有效:

namespace ClassLibrary1
{
    public interface IComponentGuid { }

    class ComponentGuid : IComponentGuid{}

    internal interface IComponent<out T> where T : IComponentGuid {
         IEnumerable<T> List();
     }

    class SpecificComponent : IComponent<ComponentGuid> { 
      public IEnumerable<ComponentGuid> List()
      {
          throw new System.NotImplementedException();
       }
    }

    class P
    {
        public P(IComponent<IComponentGuid> pComponent) { }
    }


    class Caller
    {
        public Caller()
        {
            var specific = new SpecificComponent();

            var p = new P(specific);
            }
    }
}

答案 1 :(得分:0)

我试过这个解决方案将IComponent接口分成两个,一个协变和一个不变量。

namespace ClassLibrary1
{
    public interface IComponentGuid { }

    public class ComponentGuid : IComponentGuid { }

    public interface IComponentBase<out T> where T : IComponentGuid
    {
        IEnumerable<T> List();
    }

    interface IComponent<T>
    {
        void AddToList(T item );
    }

    public class SpecificComponent : IComponentBase<ComponentGuid>, IComponent<ComponentGuid>
    {
        public IEnumerable<ComponentGuid> List()
        {
            throw new System.NotImplementedException();
        }

        public void AddToList(ComponentGuid item)
        {
            throw new System.NotImplementedException();
        }
    }


    public class P
    {
        public P(IComponentBase<IComponentGuid> pComponentBase) { }
    }


    class Caller
    {
        public Caller()
        {
            var specific = new SpecificComponent();

            var p = new P(specific);

        }
    }
}