强制方法参数类型匹配对象类型

时间:2019-05-05 09:27:01

标签: c# types

请考虑以下内容:

public interface IFoo
{
   IFoo Bar(IFoo other);
}

这并不完全代表我想要的;它说如果一个类实现IFoo,则它有一个Bar()方法,该方法接受类型也实现IFoo any 对象。我要表达的意思是Bar()接受与调用它的对象相同类型的任何对象。 (我也想保证它也返回相同的类型。)

真的想说的是类似的东西

this Bar(this other); // Obviously, this is a syntax error.

T Bar<T>(T other) where T : this; // Also not allowed.

T Bar<T>(T other) where T : typeof(this); // Nope.

有人知道该怎么做吗?我不知道。

(很明显,我可以在运行时检查参数的类型,如果不匹配则抛出异常。但是我真的希望在编译时保证它……)

2 个答案:

答案 0 :(得分:0)

    interface IFoo
    {
        T Bar<T>(T foo) where T : IFoo;
    }

嗯,IDE中没有下划线。应该允许的。返回值和参数应为同一类型。用法示例:

    interface IFoo
    {
        T Bar<T>(T foo) where T : IFoo;
    }

    class Foo : IFoo
    {
        public T Bar<T>(T foo) where T : IFoo
        {
            throw new NotImplementedException();
        }
    }

    new Foo().Bar<Foo>(new Foo());

答案 1 :(得分:0)

到目前为止,我能想到的最接近的是:

public interface IFoo<T>
{
    T Bar(T other);
}

public class Moo : IFoo<Moo> {...}

public void UseIFoo(T stuff) where T : IFoo<T> {...}

我曾期望where T : IFoo<T>抱怨类型约束的影响……但事实并非如此。 似乎可以很好地进行编译...我想这已经接近了。