Проблема, например, в подходе dynamic
заключается в том, что он дает ошибку времени выполнения.Наличие универсального кода, который компилируется, но выдает ошибку времени выполнения из-за несоответствия типов, всегда кажется мне «ложью» - если вы не можете выразить его как ограничение параметра типа и если компилятор не справился с компиляцией, вы не должны писать этот универсальный метод.
Вместо этого я бы поставил два метода:
void DoSomething<U>(KeyValuePair<int, U> a)
{
DoSomething(a.Key);
}
void DoSomething<U>(KeyValuePair<char, U> a)
{
DoSomething(a.Key);
}
Теперь вы можете предоставить только KeyValuePair
s, с которыми мы знаем, как правильно обращаться, и все остальное возвращается к генерацииошибки времениЯ предпочитаю небольшую избыточность 1 , чтобы получить ошибку во время компиляции.
Конечно, в приведенном выше примере полезность этих методов несколько сомнительна, но в большей базе кодавы все еще можете абстрагировать некоторые функциональные возможности в частный универсальный метод, к которому относятся оба этих DoSomething
метода.
1 И, конечно,в исходном коде есть только «кажущаяся» избыточность.В скомпилированном IL для этих методов ссылки на другие методы DoSomething
отличаются, так как разрешение перегрузки даст другие результаты.