Условный оператор и делегат сравнения
Даны две реализации методов сравнения:
// compares by Key...
private static int CompareByKey(KeyValuePair<int, string> x, KeyValuePair<int, string> y)
{
return x.Key.CompareTo(y.Key);
}
// compares by Value...
private static int CompareByValue(KeyValuePair<int, string> x, KeyValuePair<int, string> y)
{
return x.Value.CompareTo(y.Value);
}
Почему бы не скомпилировать следующий блок кода условного оператора:
Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? CompareByKey : CompareByValue;
Ошибка компилятора: «Невозможно определить тип условного выражения, поскольку не существует неявного преобразования между« группой методов »и« группой методов »»
Однако эквивалентный блок кода, использующий if-else, не имеет проблем:
Comparison<KeyValuePair<int, string>> sortMethod;
if (isSortByActualValue)
sortMethod = CompareByKey;
else
sortMethod = CompareByValue;
(все хорошо в обоих заданиях выше)
Как и условный оператор, если я приведу делегат сравнения:
Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? (Comparison<KeyValuePair<int, string>>) CompareByKey : CompareByValue;
(все хорошо в приведенном выше задании, когда приведение происходит, хотя приведение было только в истинной части)