Общее расширение с меньшими аргументами, чем параметры

Я наткнулся на эту проблему, если я определяю класс

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" можно найти (вы отсутствуете использование директивы или ссылки на сборку?)

После тестирования я обнаружил, что расширение должно использовать каждый общий параметр в атрибуте функции.

Почему это?

Есть ли какая-нибудь работа вокруг?


Контекст

Благодаря этому ответу я смог реализовать ограничения для генерических классов (чтобы заставить их вести себя как специализация шаблонов С++). Решение использует ограничения ограничений для получения ошибок времени компиляции для неспециализированных специализаций.

Ответ 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
    }
}