Это не полностью устраняет использование бокса и кастинга ... оно просто значительно уменьшает их. Иногда вы действительно знаете больше, чем компилятор о типах вещей. Например, предположим, что вы подключили один и тот же обработчик событий ко многим кнопкам. Это совсем необоснованно использовать:
public void HandleClickEvent(object sender, EventArgs e)
{
// We know it will always be a button, and we want an exception if it's not
Button button = (Button) sender;
...
}
Вот и все - кастинг не умер.
Точно так же происходит бокс, в ситуациях, когда вы не знаете точный тип во время компиляции и не можете выразить его в общем виде. Два наиболее очевидных примера этого:
- Отражение (выбор значения свойства с отражением даст вам
object
, если необходимо, бокс)
Динамическая типизация в C # 4:
dynamic d = CreateDynamicObject();
int x = d.Foo(); // The dynamic call would have to box if necessary,
// the conversion will unbox
Так что бокс тоже не умер.
Если вы только говорите о хранении значений в коллекциях, то это правда, что бокс и приведение теперь появляются в коде намного, намного реже, чем раньше. Но не все в коллекции, и дженерики полезны и вне коллекций.