otrzymuje dwie implementacje metod porównania:Warunkowe operator i Porównanie Delegat
// 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);
}
dlaczego nie następujące Operator warunkowy blok kodu kompilacji:
Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? CompareByKey : CompareByValue;
błąd kompilatora: „Typ wyrażenia warunkowego nie może być określone, ponieważ nie istnieje żadna niejawna konwersja między "grupą metod" a "grupą metod" "
Jednak równoważny blok kodu przy użyciu opcji if-else d OES nie ma żadnego problemu:
Comparison<KeyValuePair<int, string>> sortMethod;
if (isSortByActualValue)
sortMethod = CompareByKey;
else
sortMethod = CompareByValue;
(dobre w obu zadaniach powyżej)
Tak samo operator warunkowy, jeśli rzucam delegata porównania:
Comparison<KeyValuePair<int, string>> sortMethod;
sortMethod = isSortByActualValue ? (Comparison<KeyValuePair<int, string>>) CompareByKey : CompareByValue;
(wszystko dobre w powyższe przypisanie, podczas rzucania, chociaż rzut był tylko na prawdziwej części)
Jak są zdefiniowane kryteria CompareByAcutalValue i CompareByDisplayValue? Wyświetlasz tylko definicję CompareByKey i CompareByValue. –
Fragment kodu w moim poście został zmodyfikowany dla zachowania przejrzystości. Nie zdawałem sobie sprawy, że zmieniłem nazwę (metody) tylko częściowo. Dzięki Eric, zaktualizowałem wszystkie odniesienia do CompareByActualValue do CompareByKey (i CompareByDisplayValue do CompareByValue). – Arun