Является ли Func <T, TResult> специальным делегатом или мы можем также создать его вручную? - PullRequest
1 голос
/ 12 июля 2011

Func<T, TResult> делегат предназначен для делегата с одним параметром и возвращаемым типом TResult.

Это специальный делегат или это то, что мы можем кодировать сами?Я создаю Func<T, TResult>, но он принимает 2 входных параметра?

Ответы [ 4 ]

9 голосов
/ 12 июля 2011

"Func" на самом деле семейство классов в пространстве имен System, а именно:

Func<TResult> (0 параметров), Func<T,TResult> (1 параметр), Func<T1,T2,TResult> (2 параметра) ... Func(17) (16 параметров).

Всего имеется 17 различных классов «Func», поддерживающих от 0 до 16 параметров. Они могут совместно использовать имя в коде («Func»), даже если они на самом деле различных типов (Func, Func', Func'' и т. Д.) Благодаря тому, как Generics работает в .NET - число генериков определяет / устраняет неоднозначность , какой используется фактический тип.

Счастливого кодирования.


Что касается преобразования между делегатами, это может быть полезно (работает в LINQPad , "Программа C #"):

delegate int MyDelegate (int y);

void Main()
{
    Func<int,int> fun1 = (q) => q * q;
    MyDelegate del = new MyDelegate(fun1); // Convert the "Func" delegate to custom...
    Func<int,int> fun2 = new Func<int,int>(del); // ...and back
}
3 голосов
/ 12 июля 2011

Уже есть Func<TParam1, TParam2, TResult>, который делает это.Но то, что вы просите, немного отличается (вы знаете, что оба параметра одного типа).Вы все еще можете использовать один и тот же параметр типа дважды со встроенным Func, но если вы действительно хотите, вы можете сделать это:

public delegate TResult MyFunc<T, TResult>(T param1, T param2);
1 голос
/ 12 июля 2011

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

http://msdn.microsoft.com/en-us/library/dd402862.aspx

и все варианты между нимиПо сути, первые n-1 аргументы являются входными, а последнее является возвращаемым значением.

Итак, Func<int,int,int,int> сравнивается с делегатом, который принимает 3 аргумента int и возвращает int.

1 голос
/ 12 июля 2011

Уже есть Func<T1, T2, TResult>, который принимает два входных параметра.

Хотя, чтобы ответить на ваш вопрос, нет, он не особенный по сравнению с любым другим делегатом, и вы могли бы создать свой собственный, но почему бы вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...