我想知道是否可以在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;
}
}
此类将抛出编译器错误“无法将类型'MyNamespace.Robot'隐式转换为'Robot'”,但如果您符合这样的类型名称:
class Robot: Interface2<Robot>
{
private MyNamespace.Robot friend;
MyNamespace.Robot Friend<Robot>() {
return friend;
}
}
它将更改为“'MyNamespace.Robot'未实现接口成员'MyNamespace.Interface2.Friend()'。'MyNamespace.Robot.Friend()'无法实现'MyNamespace.Interface2.Friend()',因为它没有匹配的返回类型'T'。“
有没有办法制作Interface1?我忽略了任何反射魔法?
答案 0 :(得分:1)
以下作品:
interface Interface2<T> where T : Interface2<T>
{
T Friend();
}
class Robot : Interface2<Robot>
{
private Robot friend;
public Robot Friend()
{
return friend;
}
}
没有必要将通用类型放在Friend
方法上。
另外,不幸的是,据我所知,没有办法制作Interface1
。