Прежде всего, я знаю, что могу просто определить два перегруженных вспомогательных метода, чтобы делать то, что мне нужно (или даже просто определить два Func <> с разными именами), но они используются только одним открытым методом, поэтому я ' m изучает способы определения двух локальных функций Functions <>, которые также перегружаются с использованием одного и того же имени. Взять, к примеру:
string DisplayValue(int value)
{ return DisplayValue(value, val => val.ToString()); }
string DisplayValue(int value, Func<int, string> formatter)
{ return (value < 0) ? "N/A" : formatter(value); }
Мне нужно многократно вызывать одну или другую версию в моем публичном методе для пользовательского форматирования специальных значений, поэтому я подумал, что могу "перевести" вышеприведенное в нечто вроде этого:
Func<int, Func<int, string>, string> displayValue =
(value, formatter) => (value < 0) ? "N/A" : formatter(value);
Func<int, string> displayValue =
value => displayValue(value, val => val.ToString());
Даже когда я печатал его, я знал, что не могу объявить два идентификатора делегата с одинаковыми именами, даже если они разных типов. Это более академично, чем то, что я полностью настроен на достижение перегрузок с помощью Func <>, но я думаю, они просто не могут сделать все, верно?
И я думаю, что вы не можете сделать что-то подобное, либо:
Func<string, params object[], string> formatArgs =
(format, args) => string.Format(format, args);