Есть ли способ избежать передачи двух общих c параметров в моем методе Extension? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть класс типа Installer, где TModel имеет ограничение. Я хочу создать метод расширения с сигнатурой типа: \

public static void DoRepetitiveStuff<TOtherObject, TModel>(this Installer<TModel> installer)
where TModel : class, IConstraint, new()
where TOtherObject : class, IOtherConstraint, new()
{
   installer.DoSomeStuff<TOtherObject>(c => { });
}

цель состоит в том, чтобы в конечном итоге я мог вызвать функцию, используя простой installer.DoRepetitiveStuff<TOtherObject>();

По какой-то причине, когда я вызываю эта функция в моем другом файле. Он жалуется, что нет никакого метода расширения, который принимает Установщик в существовании ... Мне нужно использовать его с:

installer.DoRepetitiveStuff<TOtherObject, TModel>();

Кто-нибудь знает почему?

1 Ответ

2 голосов
/ 18 февраля 2020

Компилятор C# не может определить частичное обобщение c подпись . Это в основном все или ничего. Почему?

Допустим, ваш код принят, а затем вы создаете новый метод:

public static void DoRepetitiveStuff<TOtherObject>(this Installer installer)
where TOtherObject : class, IOtherConstraint, new()
{
   installer.DoOtherStuff();
   installer.DoSomeStuff<TOtherObject>(c => { });
}

Теперь, какой метод вызывает ваш код? Твой или этот? Мы не можем знать, потому что это неоднозначно.

Чтобы избежать этого, либо компилятор выводит полную сигнатуру, либо ее вообще нет.

В качестве альтернативы вы потребуется ввести другой класс, который может сделать вывод для вас. Однако на данный момент более кратко указать оба обобщенных типа c.

...