Я наткнулся на эту проблему, если я определяю класс
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" можно найти (вы отсутствуете использование директивы или ссылки на сборку?)
После тестирования я обнаружил, что расширение должно использовать каждый общий параметр в атрибуте функции.
Почему это?
Есть ли какая-нибудь работа вокруг?
Контекст
Благодаря этому ответу я смог реализовать ограничения для генерических классов (чтобы заставить их вести себя как специализация шаблонов С++). Решение использует ограничения ограничений для получения ошибок времени компиляции для неспециализированных специализаций.