2010-09-15 5 views
7

¿Qué significa "Desde cualquier tipo de clase S a cualquier tipo de interfaz T, siempre que S no esté sellado y siempre que S no implemente T". en realidad significa?¿Qué significa "De cualquier tipo de clase S a cualquier tipo de interfaz T, siempre que S no esté sellado y siempre que S no implemente T." en realidad significa?

me encontré con esto en las especificaciones del lenguaje C# here:

6.2.4 conversiones referencia explícita

conversiones La referencia explícita son:

  • ...
  • Desde cualquier tipo de clase S a cualquier tipo de interfaz T, pro RESPETA S no es sellado y proporciona S no implementar T.

que pueda entender lo que "siempre y S no está cerrado", pero no estoy seguro si entiendo lo que hace "proporcionada S no implementar T "realmente significa.

Por ejemplo:

class S {}//not sealed, nor does it implement T 
interface T {} 
... 
T t = (T)new S();//will throw InvalidCastException. 

Podría ser que se encuentra en las especificaciones sólo para enumerar todas las formas sintácticamente correctas de expresar una conversión explícita referencia, independientemente de si se va a lanzar una excepción o no? ¿O significa alguna otra cosa que no sé (a partir de ahora)?

Gracias de antemano.

+0

Nota: En su ejemplo, la conversión explícita existió. De lo contrario, no se habría compilado. Todo es bueno en tiempo de compilación. El hecho de que la conversión explote en el tiempo de ejecución es algo típico de las conversiones * explicit *. A veces arrojan, a veces tienen éxito. Ahora, en cambio, si 'S' implementa' T', hay *** una conversión de referencia *** implícita (ver otra subsección sobre eso). Entonces, la razón por la que dicen que 'S' no implementa' T' es que de lo contrario ya habría otra conversión (superior) disponible. –

Respuesta

6

El juego de palabras es en la parte "no sellada":

class S {} //not sealed, nor does it implement T 
interface T {} 

class S2 : S, T { } 

    S s = new S2(); // S reference to an S2 instance, implicit conversion 
    T t = (T)s;  // OK, s refers to an S2 instance that does implement T 

Podría ser que se encuentra en las especificaciones sólo para enumerar todas las formas sintácticamente correctas de expresar una conversión explícita referencia, ...

Sí, el compilador debe permitirlo a menos que sepa que la conversión es imposible.

Si mira T t = (T)s;, si se selló S entonces el compilador podría saber con certeza que la conversión era imposible.Pero con un S sin sellar, debería eliminarse la posibilidad de que s haga referencia a un tipo S2, y eso no es práctico/posible (S2 podría estar en otro ensamblaje).

+0

_ lol, la parte no sellada de hecho dijo que la herencia ** está ** involucrada. No lo vi al instante;). gran lección sobre lectura explícita –

+0

Gracias! Duda, seré capaz de conseguirlo solo. – blizpasta

0

¿Estás seguro de que no es un error en el texto?

proporcionada S qué implemento T.

Edición: He encontrado la referencia: http://msdn.microsoft.com/en-us/library/aa691291(v=VS.71).aspx

Eso es explícita conversión referencia, significa que no está implícito! Entonces la oración "De cualquier tipo de clase S a cualquier interfaz-tipoT, siempre que S no esté sellada y siempre que S no implemente T" sea correcta, no puede ser una conversión implícita, por lo que debe ser explícita (y no es garantizado que tendría éxito).

+0

Pensé que podría ser un error. Sin embargo, puede ser que simplemente no sepa cómo interpretarlo correctamente, teniendo en cuenta la analogía de "lo más probable es que sea un error en el código y no en el compilador". – blizpasta

-1

Parece que todo se trata de conversiones definidas por el usuario.

Definitivamente no se puede echar la clase S de interfaz S T si no implementa T.

+0

Las conversiones definidas por el usuario son irrelevantes aquí. El hecho de que tenga una referencia a un objeto que actúa como S, no significa que es exactamente una S y no algo que es superconjunto de S. Ese superconjunto podría ser convertible con las reglas de conversión estándar a T. –

0

La especificación va a decir:

Las conversiones explícitas de referencia son aquellas conversiones entre tipos de referencia que requiere verificaciones en tiempo de ejecución para garantizar que sean correctas.

En otras palabras, los tipos de conversión mencionados aquí son los de conversión explícita, en el que el compilador no puede hacer la verificación si dicha conversión es posible y válido en tiempo de compilación, debido a la falta de una relación explícita entre los dos tipos . Tal intento de conversión se resolverá durante la ejecución del programa y podría dar lugar a una excepción, si la conversión es imposible.

El ejemplo canónico de una conversión explícita en tiempo de ejecución que podría fallar, pero también podría tener éxito, sería la conversión de tipo de interfaz S a tipo de interfaz T, donde S y T no están relacionados. El éxito depende de si el objeto subyacente implementa ambas interfaces o no.

Particular curioso ejemplo del caso sobre el que usted preguntó - desde clase S a interfaz tipo T, donde S no implementa T (y no está sellado), sería cuando S es un objeto COM, y T es una interfaz COM no enumerada explícitamente en la biblioteca de tipos tal como la implementó el coclass. En este caso, la conversión podría fallar, pero también podría tener éxito, dependiendo de la implementación particular de IUnknown :: QueryInterface del coclass. (Tenga en cuenta que técnicamente, el coclass en este caso está implementando la interfaz, pero no lo anuncia al compilador)

Y, por supuesto, el ejemplo de @Henk Holterman de S2: S, T es también un buen ejemplo donde esa conversión puede tener exito

Cuestiones relacionadas