如何在实现接口时从通用方法正确返回T?

Bob*_*Bob 2 c# generics polymorphism

我正在处理一个错误.在重新创建以下示例的错误时,我能够确定问题发生的原因.但我坚持要求更好的解决方案.所以给出以下程序:

public interface IFoo<T> {
    T OutputType(T param);
}

class Foo : IFoo<Foo> {
    public virtual Foo OutputType(Foo param) {
        Console.WriteLine("foo");
        return param;
    }
}

class Bar : Foo, IFoo<Bar> {
    public virtual Bar OutputType(Bar param) {
        Console.WriteLine("bar");
        return param;    
    }
}

class Program {
    static void Main(string[] args) {
        Bar bar = new Bar();
        CallOutputType(bar);
        bar.OutputType(bar);
    }

    static void CallOutputType<T>(T t) where T : Foo {
        t.OutputType(t);
    }      
}
Run Code Online (Sandbox Code Playgroud)

我期待输出为:

bar
bar
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

foo
bar
Run Code Online (Sandbox Code Playgroud)

看到像这样简化的问题很明显Bar.OutputType没有覆盖Foo.OutputType.改善这种设计的最佳选择是什么? Bar.OutputType无法覆盖Foo.OutputType,因为签名不同.更改签名Bar.OutputType匹配Foo.OutputType不会起作用,因为随后酒吧不会implimenting IFoo的.

Spe*_*ort 5

呃,我对这些东西不太熟悉,但不应该是:

static void CallOutputType<T>(T t) where T : IFoo<T>
{
   t.OutputType(t);
}
Run Code Online (Sandbox Code Playgroud)

它在编译时起作用了.