【发布时间】:2016-03-15 21:55:21
【问题描述】:
如果我定义一个类,我偶然发现了这个问题
class MyClass<T,U> {
internal T myEement {get;set;}
public MyClass(T Element) {
myEement = Element;
}
}
并声明扩展。
static class MyClassExtension{
//What I want to do
public static void nonWorkingExtension<P,T,U>(this P p, U u) where P:MyClass<T,U>
{
T Element = p.myEement;
//Do something with u and p.Element
}
//What I have to do
public static void workingExtension<P, T, U>(this P p, T dummy, U u) where P : MyClass<T, U>
{
T Element = p.myEement;
//Do something with u and p.Element
}
}
打电话给他们时:
MyClass<int, double> oClass = new MyClass<int, double>(3);
oClass.workingExtension(0,0.3); //I can call this one.
oClass.nonWorkingExtension(0.3); //I can't call this.
错误退出。
错误 1 'MyClass' 不包含 'doSomething' 并且没有扩展方法 'doSomething' 接受第一个 可以找到“MyClass”类型的参数(您是否缺少 using 指令还是程序集引用?)
经过测试我发现扩展必须在函数属性中使用每个泛型参数。
这是为什么?
有什么解决办法吗?
上下文
感谢this answer,我能够在泛型类上实现约束(使它们表现得像 C++ 模板特化)。该解决方案使用扩展约束来在未实现的特化上产生编译时错误。
【问题讨论】:
标签: c# generics extension-methods