在接口方法上,可以通用类型参数.被限制为类型实现接口

本文关键字:接口 类型 实现 类型参数 方法 | 更新日期: 2023-09-27 18:16:54

我想知道以下这些是否可以在c#中完成,但如果你知道一个替代的。net路径(f#, VB等),我也想听听。

在接口(或抽象类)中,在泛型方法上,我希望将方法的泛型类型参数约束为实现该接口的具体类。


在伪代码中,接口可能看起来像这样:
interface Interface1<T> 
    where typeof(T) == this.GetType() //Illegal
{
    T Friend<T>();
}

下一个变量编译时会发出警告,"类型参数'T'与外部类型'Interface2'的类型参数名称相同"

interface Interface2<T>
    where T : Interface2<T>
{
    T Friend<T>(); //The second 'T' will have the green warning underline.
}

这个伪代码的语义定义了一个比我真正想要的约束更少的约束。实现Interface1的类必须使用自己作为类型参数,

class Class1 : Interface1<Class1> //Legal
class Class2 : Interface1<Class1> //Constraint violation

实现Interface2的类可以使用任何实现Interface2的类作为类型参数。

class Class1 : Interface2<Class1> //Ok
class Class2 : Interface2<Class1> //Ok

实现类可能是这样的:

class Robot: Interface2<Robot> 
{
    private Robot friend;
    Robot Friend<Robot>() {
        return friend;
    }
}

这个类会抛出编译错误"Cannot implicit convert type 'MyNamespace "。Robot'到'Robot'",但是如果您像这样限定一些类型名称:

class Robot: Interface2<Robot> 
{
    private MyNamespace.Robot friend;
    MyNamespace.Robot Friend<Robot>() {
        return friend;
    }
}

它将更改为"MyNamespace"。Robot'没有实现接口成员' mynamspace . interface2 . friend()'。' mynamspace . robot . friend()'不能实现' mynamspace . interface2 . friend()',因为它没有匹配的返回类型'T'。"

是否有办法使Interface1?有没有我忽略的反射魔法?

在接口方法上,可以通用类型参数.被限制为类型实现接口

以下作品:

interface Interface2<T> where T : Interface2<T>
{
    T Friend();
}
class Robot : Interface2<Robot>
{
    private Robot friend;
    public Robot Friend()
    {
        return friend;
    }
}

不需要将泛型类型放在Friend方法上。

同时,不幸的是,据我所知,没有办法使Interface1