在接口方法上,可以通用类型参数.被限制为类型实现接口
本文关键字:接口 类型 实现 类型参数 方法 | 更新日期: 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
。