Могу ли я передать метод с параметром out как Func?
public IList<Foo> FindForBar(string bar, out int count) { }
// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }
Для Func нужен тип, поэтому out не будет компилироваться, а для вызова listFunction требуется int и не будет разрешен вход.
Есть ли способ сделать это?
T
как контравариантный иV
ковариантный. Однако, поскольку параметр (output
) типаU
передается по ссылке , онU
не может быть помечен как со-или контравариантный и должен оставаться «инвариантным». Так что подумайте, используетеpublic delegate V MyDelegate<in T, U, out V>(T input, out U output);
ли вы C # 4 или новее.ref
параметра сin
иout
параметрами .Почему бы не создать класс для инкапсуляции результатов?
источник
Func
Семья делегатов (илиAction
в этом отношении) не что иное , как простые типы делегатов , объявленные каки т. д. Делегаты как таковые могут иметь параметры out / ref, поэтому в вашем случае это только вопрос индивидуальной реализации, как указали другие ответы. Что касается того, почему Microsoft не упаковала это по умолчанию, подумайте о том, какое количество комбинаций ей потребуется.
только для двух параметров. Мы даже не трогали
ref
. Это на самом деле было бы громоздким и запутанным для разработчиков.источник
delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)
иdelegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj)
. Таким образом, помимо количества перегрузок имя символа является еще одной причиной, по которой Microsoft не может добавить эти перегрузкиFunc
.Вы могли бы обернуть его в лямбда / делегат / функцию / метод, который выставил правильный интерфейс и вызвал FindForBar, но я подозреваю, что FindForBar имеет значение в качестве параметра out в качестве причины, поэтому вам нужно быть уверенным, что выбрасывание этой информации было ОК / безопасно / желательно / дали правильные результаты (вам нужно быть уверенным в этом, даже если вы могли бы просто напрямую перейти в FindForBar).
источник