2012-09-21 4 views
5

Dire, ho un'interfacciaPerché non è possibile definire l'operatore di trasmissione implicito dall'interfaccia alla classe?

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

E 'possibile definire smth come questo:

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

O meglio perché non posso farlo in C#?

+2

La risposta è: No – leppie

+1

@leppie Cosa mi manca? Perché questo approccio è assolutamente sbagliato? – horgh

+0

Per i principianti un'interfaccia non può avere alcuna implementazione quindi non hai nessun luogo per definire quell'operatore – Jamiec

risposta

5

E se tu avessi una sottoclasse di Control, e che sottoclasse implementato l'interfaccia ISomeControl.

class SomeControl : Control, ISomeControl {} 

Ora un cast sarebbe ambiguo: l'upcast incorporato e la conversione definita dall'utente. Quindi non puoi fornire conversioni definite dall'utente per interfacce.

+0

Questo ha molto senso +1 – leppie

+0

Posso capire che consentire conversioni da un'interfaccia a un tipo di classe sarebbe ambiguo, ma non vedo l'ambiguità se una classe definisce un operatore di conversione da un'interfaccia a se stesso. Se esiste una conversione da 'BaseType' a' Foo', una classe 'DerivedType' può anche definire una conversione a' Foo' senza creare ambiguità. Se una classe non implementa un'interfaccia particolare, ma una sottoclasse, la fusione di un riferimento di tipo base su quell'interfaccia dovrebbe utilizzare la conversione definita dall'utente (indipendentemente dal fatto che l'oggetto di riferimento implementa l'interfaccia) ... – supercat

+0

... mentre l'utilizzo di un riferimento di classe derivata dovrebbe utilizzare la conversione definita staticamente per la classe derivata. Anche nel caso di 'Foo : ISomething ' specificando una conversione in 'ISomething ' Non vedo le interfacce come in grado di proporre alcun "problema" che le classi non avrebbero. – supercat

1

Non puoi farlo.

C# specifiche dicono:

6.4.1 ammesse conversioni definite dall'utente

C# consente solo alcune conversioni definite dall'utente da dichiarare. In particolare, in , non è possibile ridefinire una conversione implicita o esplicita già esistente. Per un dato tipo di sorgente S e target tipo T, se S o T sono tipi annullabili, lasciare S0 e T0 fare riferimento ai rispettivi tipi sottostanti , altrimenti S0 e T0 sono uguali a S e T rispettivamente. Una classe o struttura è permesso dichiarare una conversione da un tipo di sorgente S di un tipo di target T solo se tutte le seguenti sono vere:

  • S0 e T0 sono diversi tipi.

  • O S0 o T0 è il tipo di classe o di struttura in cui ha luogo la dichiarazione dell'operatore.

  • Né S0 né T0 è un tipo di interfaccia.

  • Escludendo conversioni definite dall'utente, una conversione non esiste da S a T o da T a S.

Un modo per farlo è di avere un metodo statico.

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

Questo non indirizza "perché?".Inoltre, penso che stia parlando della classe 'Control' fornita da Microsoft, quindi non puoi aggiungerla. –

+0

Non so se questa è la classe di controllo Framework. Pensavo fosse solo un esempio. – Roland

+0

'Control' è * la classe fornita da Microsoft * – horgh