2012-09-21 16 views
5

Say, tengo una interfaz¿Por qué no es posible definir el operador de conversión implícita de la interfaz a la clase?

public interface ISomeControl 
{ 
    Control MyControl { get; } 
    ... 
} 

¿Es posible definir Smth así:

public static implicit operator Control(ISomeControl ctrl) 
{ 
    return ctrl.MyControl; 
} 

O más bien ¿por qué no puedo hacer eso en C#?

+2

La respuesta es: No – leppie

+1

@leppie ¿Qué me estoy perdiendo? ¿Por qué este enfoque es absolutamente incorrecto? – horgh

+0

Para los principiantes, una interfaz no puede tener ninguna implementación, así que no tienes dónde definir ese operador – Jamiec

Respuesta

5

¿Y si tuviera una subclase de Control, y que subclase implementado la interfaz ISomeControl.

class SomeControl : Control, ISomeControl {} 

Ahora un elenco sería ambiguo: el upcast incorporado y la conversión definida por el usuario. Por lo tanto, no puede proporcionar conversiones definidas por el usuario para las interfaces.

+0

Eso tiene muy buen sentido +1 – leppie

+0

Entiendo que permitir conversiones desde una interfaz a un tipo de clase sería ambiguo, pero no veo la ambigüedad si una clase define un operador de conversión desde una interfaz a sí mismo. Si existe una conversión de 'BaseType' a' Foo', una clase 'DerivedType' también puede definir una conversión a' Foo' sin crear ambigüedad. Si una clase no implementa una interfaz particular, pero sí una subclase, la conversión de una referencia de tipo base a esa interfaz debe usar la conversión definida por el usuario (independientemente de si el objeto al que se hace referencia implementa la interfaz) ... – supercat

+0

... mientras el uso de una referencia de clase derivada debe usar la conversión que está estáticamente definida para la clase derivada. Incluso en el caso de 'Foo : ISomething ' especificando una conversión a 'ISomething ' No veo que las interfaces presenten ningún "problema" que las clases no puedan. – supercat

1

No puede hacer eso.

C# especificación dice:

6.4.1 conversiones definidas por el usuario permitidas

C# sólo permite ciertas conversiones definidas por el usuario para ser declarado. En en particular, no es posible redefinir una conversión implícita o explícita ya existente. Para una fuente dada tipo S y destino tipo T, si S o T son tipos anulables, deje que S0 y T0 se refieran a sus tipos subyacentes , de lo contrario S0 y T0 son iguales a S y T respectivamente. se permite una clase o struct para declarar una conversión de un tipo de fuente S a un tipo de objetivo T sólo si todos de los siguientes son verdaderas:

  • S0 y T0 diferentes tipos.

  • O bien S0 o T0 es la clase o tipo de estructura en el que tiene lugar la declaración del operador.

  • Ni S0 ni T0 es un tipo de interfaz.

  • Excluyendo las conversiones definidas por el usuario, una conversión no existe de S a T o de T a S.

Una manera de hacerlo es tener un método estático.

public class Control 
    { 
     public static Control FromISomeControl(ISomeControl ctrl) 
     { 
      return ctrl.MyControl; 
     } 
    } 
+0

Esto no aborda "¿por qué?".Además, creo que está hablando de la clase 'Control' proporcionada por Microsoft, por lo que no puedes agregar nada. –

+0

No sé si esta es la clase de Control de Framework. Pensé que es solo un ejemplo. – Roland

+0

'Control' es * la clase proporcionada por Microsoft * – horgh

Cuestiones relacionadas