El problema es que int no es un objeto.
Un int puede ser en caja a un objeto. El objeto resultante (también conocido como boxed int) es, por supuesto, un objeto, pero ya no es exactamente un int.
Tenga en cuenta que el "es" Estoy utilizando anteriormente no es lo mismo que el operador C# is. Mi "es" significa "es convertible por conversión de referencia implícita". Este es el significado de "es" utilizado cuando hablamos de covarianza y contravarianza.
Un int es implícitamente convertible a un objeto, pero esto no es una conversión de referencia. Tiene que estar en caja.
Un House
es implícitamente convertible a Asset
a través de una conversión de referencia. No es necesario crear o modificar ningún objeto.
Considere el siguiente ejemplo. Ambas variables house
y asset
hacen referencia al mismo objeto. Las variables integer
y boxedInt
, por otro lado, tienen el mismo valor, pero hacen referencia a cosas diferentes.
House house = new House();
Asset asset = house;
int integer = 42;
object boxedInt = integer;
Boxing and Unboxing no es tan simple como podría parecer. Tiene muchas sutilezas y podría afectar tu código de formas inesperadas. Mezclar boxeo con covarianza y contravarianza es una manera fácil de deslumbrar a cualquiera.
Me gustaría publicar una respuesta, pero no quiero perder el tiempo con la redacción. Consulte la entrada del blog de Eric Lippert aquí, específicamente los comentarios. http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx Parece ser una caso de "valores" de tipo de referencia que tienen la misma huella de memoria, que no es el caso para los tipos de valores. Dicho esto, el DelgateMethod podría hacerse genérico, que luego admitiría ints, longs, etc. –