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

无法使用具有泛型约束的同一类型从泛型基类和特定接口继承

  •  2
  • simendsjo  · 技术社区  · 14 年前

    错误1“ConsoleApplication53.DummyImplBase”未实现接口成员“ConsoleApplication53.IRequired.RequiredMethod()”ConsoleApplication53.RequiredBase.RequiredMethod()'无法实现“ConsoleApplication53.IRequired.RequiredMethod()”,因为它没有匹配的返回类型“ConsoleApplication53.Dummy”。C:\Documents and Settings\simen\My Documents\Visual Studio 2008\Projects\ConsoleApplication53\ConsoleApplication53\Program.cs 37 27 ConsoleApplication53

    public class Dummy
    {
    }
    
    public interface IRequired<T>
    {
        T RequiredMethod();
    }
    
    public interface IDummyRequired : IRequired<Dummy>
    {
        void OtherMethod();
    }
    
    public class RequiredBase<T> : IRequired<T>
    {
        public T RequiredMethod()
        {
            return default(T);
        }
    }
    
    public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired
        where T: Dummy
    {
        public void OtherMethod()
        {
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Henrik    14 年前

    您可以将此添加到DummyImplBase:

       public Dummy RequiredMethod() { return base.RequiredMethod(); }
    

    编辑:或者,如果您使用的是C#4.0,您可以更改IRequired的定义,如下所示:

    public interface IRequired<out T>
    

    IRequired<Dummy> (但不是我所要求的)。

    第二次编辑:您的原始代码没有编译,因为T可以是Dummy或从Dummy派生的类。以及实现方法

    public DummyDerived RequiredMethod() 
    

    与签名不同

    public Dummy RequiredMethod()
    

    是在伊杜姆代夫宣布的。

        2
  •  0
  •   Trond    14 年前

    我建议您将DummyImplBase更改为:

    public abstract class DummyImplBase<T> : RequiredBase<Dummy>, IDummyRequired
            where T : Dummy
    {
        public void OtherMethod()
        {
        }
    }
    
        3
  •  0
  •   simendsjo    14 年前

    如果我使IDummyRequired通用太它的作品,所以我想我将不得不改变我的一些设计,使这成为可能。我仍然希望找出为什么我的解决方案不起作用。

    public class Dummy
    {
    }
    
    public interface IRequired<T>
    {
        T RequiredMethod();
    }
    
    public interface IDummyRequired<T> : IRequired<T>
        where T : Dummy
    {
        void OtherMethod();
    }
    
    public class RequiredBase<T> : IRequired<T>
    {
        public T RequiredMethod()
        {
            return default(T);
        }
    }
    
    public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired<T>
        where T: Dummy
    {
        public void OtherMethod()
        {
        }
    }