通用扩展,参数少于参数

时间:2016-03-15 21:55:21

标签: c# generics extension-methods

如果我定义了一个类

,我偶然发现了这个问题
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指令或程序集引用?)

经过测试,我发现扩展必须使用函数属性中的每个泛型参数。

为什么会这样?

有没有工作?

CONTEXT

感谢this answer我能够在泛型类上实现约束(使它们的行为类似于C ++模板特化)。该解决方案使用扩展约束在未实现的特化上产生编译时错误。

1 个答案:

答案 0 :(得分:1)

无需使用每个通用参数。您的nonWorkingExtension()必须有效。我很确定你得到的错误与你发布的代码无关。

无论如何,回到问题。您不需要在此代码中使用任何通用约束,只需使用MyClass<T, U>代替:

static class MyClassExtension
{
    public static void nonWorkingExtension<T, U>(this MyClass<T, U> p, U u)
    {
        T Element = p.myEement;
        //Do something with u and p.Element
    }
}