Назначить метод со значениями по умолчанию для Func‹› без этих параметров?

Я хотел бы иметь возможность сделать следующее:

Func<int,bool> tryMethodFunc = TryMethod;

Где TryMethod имеет подпись, например:

bool TryMethod(int value, int value2 = 0, double value3 = 100.0)

Я не против разбить метод на каррированный формат, но было бы больше работы, если бы был способ сделать это без этого.


person Firestrand    schedule 10.12.2012    source источник
comment
Я так понимаю, Func<int,bool> tryMethodFunc => (value) => TryMethod(value) недостаточно?   -  person Chris Sinclair    schedule 10.12.2012
comment
Хм, это работает. Думаю, я просто новичок в функциональных подходах. Вы можете поставить это как ответ, и я отмечу это.   -  person Firestrand    schedule 10.12.2012
comment
Не стесняйтесь отмечать ответ КеЯна; он довольно всеобъемлющий и содержит мой обходной путь.   -  person Chris Sinclair    schedule 11.12.2012
comment
возможный дубликат Действие параметра‹T1, T2, T3› в котором T3 может быть необязательным   -  person nawfal    schedule 21.12.2013
comment
@ChrisSinclair: ответ КеЯна, похоже, удален ...   -  person testing    schedule 22.11.2018


Ответы (1)


Необязательные параметры — это языковая функция, компилятор отвечает за перевод вызовов методов с необязательными параметрами в полноценный вызов со значениями.

Посмотрите на этот простой фрагмент кода ниже,

    public void GeneralMethod()
    {
        TestMethod(6);
    }

    public bool TestMethod(int a, int b = 8)
    {
        return true;
    }

Когда вы разберете эти методы, вы увидите, что компилятор C# фактически заменил вызов TestMethod с одним параметром на вызов с обоими параметрами. Скриншот из ildasm доказывает, что

снимок экрана ildasm

Теперь, переходя к текущей проблеме, рассматриваемая строка кода пытается связать Func с методом, который имеет необязательные параметры. Если компилятор C# должен справиться с этим, он должен убедиться, что Func some знает значения по умолчанию. Хотя это могло бы быть достигнуто с помощью компилятора, это полностью противоречит цели Func.

Func предоставляет способ хранения анонимных методов простым и обобщенным способом." ссылка

Другой подобный вопрос в stackoverflow можно найти здесь

Решение @Chris Sinclair позволяет обойти эту проблему, создав анонимный метод, который принимает один параметр и вызывает метод TryMethod из тела этого анонимного метода.

person humblelistener    schedule 10.12.2012