【问题标题】:Generic Extension with less arguments than parameters参数少于参数的通用扩展
【发布时间】: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


    【解决方案1】:

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

    不管怎样,回到问题上来。您不需要在此代码中使用任何通用约束,只需使用 MyClass&lt;T, U&gt; 代替:

    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
        }
    }
    

    【讨论】:

    • 我发布的代码在 `nonWorkingExtensions()` 上崩溃了。无论如何,我会检查您的建议是否也不会崩溃。
    • @xvan “崩溃”是什么意思?它不编译还是什么?
    • 是的,抱歉,它无法编译。
    • 删除 P 修复了参数问题,但我需要保留它以应用专业化约束。我尝试在您的代码中使用虚拟参数包装workingExtension(),但它找不到扩展名(尝试从MyClass 内部调用workingExtension() 时也会发生同样的情况)
    • @xvan 这很奇怪,因为我无法想象有任何理由对扩展方法的P 施加约束。无论如何,如果你想这样,每次调用方法时都需要明确指定类型参数。像这样:oClass.nonWorkingExtension&lt;MyClass&lt;int, double&gt;, int, double&gt;(0.3);
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多