Esto es causado por el uso de los CLR boxing and unboxing. Siempre que trate un tipo de valor como un objeto, el CLR automáticamente insertará este tipo de valor dentro de un objeto. El CLR sin embargo, sólo admite objetos en caja unboxing en su tipo de valor original como por MSDN:
Unboxing
Unboxing es una conversión explícita del objeto de tipo a un tipo de valor o de un tipo de interfaz a un tipo de valor que implementa la interfaz . Una operación unboxing consiste en:
object o = b;
Hace que el CLR para creado un byte en caja y lo almacena en O como un objeto. var i = (int)o;
luego intenta desempaquetar el byte encuadrado en un int. Esto causa una excepción ya que el tipo en caja (byte) y el tipo de valor (int) son diferentes.
Esta pregunta explora esto: http://stackoverflow.com/questions/5588073/generics-casting-and-value-types-why-is-this-illegal - en particular, la respuesta de Eric Lippert es buena lectura. –
@MattGreer Eso responde exactamente a mi pregunta. – jelbourn