У меня перегружены методы, один универсальный и один неуниверсальный.Оба метода получают выражение Linq как один параметр:
public void Test(Expression<Action<char>> expr) {}
public void Test<T>(Expression<Func<char, T>> expr) {}
Теперь рассмотрим следующий вызов:
var sb = new StringBuilder();
Test(c => sb.Append(c));
Компилятор выберет универсальный метод, поскольку метод Append()
делает(к сожалению) вернуть StringBuilder
.Тем не менее, в моем случае мне абсолютно необходимо вызвать неуниверсальный метод.
Следующий обходной путь показывает, что в коде нет проблем с типами (неуниверсальный вызов будет вполне допустимым):
Expression<Action<char>> expr = c => sb.Append(c);
Test(expr);
Однако я бы предпочел не объявлятьпеременная с явным типом и вместо этого каким-то образом заставить компилятор выбрать неуниверсальный метод (точно так же, как я мог бы сказать ему использовать универсальный метод с явными параметрами типа).
Вы можете поиграть с этим на SharpLab.io .