2010-03-26 6 views
6

Se faccio una classe di test vuoto:Cosa significa il compilatore C# quando stampa "esiste una conversione esplicita"?

public class Foo 
{ 
} 

E cerco di compilare il codice con questa affermazione:

Foo foo = "test"; 

Allora ottengo questo errore come previsto:

non può implicitamente convertire il tipo 'stringa' in 'ConsoleApplication1.Foo'

Tuttavia, se cambio la dichiarazione di Foo dalla classe di interfacciarsi, i cambiamenti di errore a questo (sottolineatura mia):

Non può convertire implicitamente il tipo 'stringa' a 'ConsoleApplication1.Foo'. Esiste Una conversione esplicita (stai manca un cast?)

che cosa è questa "conversione esplicita", che si suppone di esistere?

aggiornamento: il problema è un po 'più sottile di quanto pensassi inizialmente. Per riprodurlo, inserire questo codice in una nuova applicazione console in Visual Studio 2008:

namespace ConsoleApplication1 
{ 
    class Foo 
    { 
    } 

    interface IFoo 
    { 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
     Foo b = "hello"; 
     } 
    } 
} 

studio visivo mostrerà automaticamente l'errore corretto a questo punto (prima di costruire il codice). Ora inserisci "I" per trasformare "Foo" in "IFoo" e attendi alcuni secondi senza creare. La versione di "conversione esplicita esistente" dell'errore verrà ora visualizzata automaticamente nella finestra di output degli errori e nella descrizione dello strumento per l'errore di assegnazione.

L'errore errato di scompare nuovamente quando si preme esplicitamente F6 per creare.

+0

Da segnalare, questo errore viene visualizzato nella finestra di output non il (build) LISTA ERRORI. – gingerbreadboy

+0

Non riesco ancora a visualizzare l'errore con il codice modificato, sono presenti componenti aggiuntivi o impostazioni speciali? –

+1

quali sono i plugin VS in esecuzione? Non riesco a riproporre questo problema in VS2008 SP1, Win XP SP3 x32. Ottengo l'errore previsto in entrambi i casi. FWIW, sto anche eseguendo ReSharper 5.0RC EDIT: Ron mi ha battuto per farlo! :) –

risposta

10

io sono in grado di riprodurre il comportamento riportato. Se infatti si riproduce, questo è un bug. Non esiste una conversione esplicita da stringa a qualsiasi interfaccia definita dall'utente.

si prega di aggiornare la questione con il numero di versione del compilatore che si sta utilizzando e un piccolo programma che riproduce il problema, e vado a prendere un bug inserito nel database dei bug.

Grazie!

AGGIORNAMENTO: Apparentemente non si riproduce sulla riga di comando, ma è presumibilmente riprodotto in VS2008.

Non riesco a riprodurlo nella build RC di VS2010, quindi se questo era in effetti un bug in VS2008, probabilmente è stato risolto. Non ho un'installazione di VS2008 a portata di mano adesso per testare purtroppo.

Indipendentemente da ciò, se si sta osservando tale diagnostica, le probabilità sono molto buone, è semplicemente un errore nell'euristica che riporta l'errore nell'analizzatore semantico. Chiaramente non esiste una conversione esplicita da stringa a IFoo.

Esiste una conversione esplicita da qualsiasi tipo non sealed a qualsiasi tipo di interfaccia perché potrebbe esserci un tipo derivato che implementa l'interfaccia. Ma la stringa è sigillata, quindi l'errore dovrebbe essere semplicemente "nessuna conversione".

+0

Ho appena provato a riprodurlo sulla riga di comando con alcune versioni di csc.exe, ma non riesco a riprodurlo in quel modo. Lo vedo solo quando costruisco con lo studio visivo 2008. Correzione –

+0

, lo vedo solo quando mi fido degli errori che lo studio visivo mostra automaticamente * prima * che costruisco. –

+0

Posso anche confermare che non vedo questo in VS2010 RC. –

0

Impossibile riprodurre questo. CS0029 Basta

Impossibile convertire implicitamente il tipo 'tipo' a 'tipo'"

CS0266, comunque, dice

Impossibile convertire implicitamente il tipo 'tipo1' a 'tipo2'. Esiste una conversione esplicita (manca un cast?)

ma con Foo essendo una classe/interfaccia vuota questo non è possibile, IMO.

1

strappato senza vergogna da MSDN - Compiler Error CS0266 e MSDN - explicit (C# Reference).

Questo errore si verifica se si dispone di codice che tenta di convertire due tipi che non possono essere convertiti implicitamente, ad esempio in un'assegnazione di un tipo di base a un tipo derivato che manca un cast esplicito.

La parola chiave esplicita dichiara un operatore di conversione del tipo definito dall'utente che deve essere richiamato con un cast. Ad esempio, questo operatore converte da una classe chiamata Fahrenheit a una classe chiamata Celsius:

// Must be defined inside a class called Farenheit: 
public static explicit operator Celsius(Farenheit f) 
{ 
    return new Celsius((5.0f/9.0f)*(f.degrees-32)); 
} 

Questo operatore di conversione può essere richiamato in questo modo:

Farenheit f = new Farenheit(100.0f); 
Celsius c = (Celsius)f; 
0

Questo errore si sarebbe verificato se si fosse scritto:

class Foo:IFoo 
{ 
} 

interface IFoo 
{ 
} 

static void Main(string[] args) 
{ 
    IFoo i = new Foo(); 
    Foo f = i; // here this message would occur, since IFoo *can* Convert to Foo (Since Foo implements IFoo), but it must be casted explicitly 
} 
0

Sì, c'è nessun modo esplicito per convertire tra Foo e string. Tuttavia, se desideri utilizzare questa sintassi, puoi usare Foo foo = "Hello World" come abbreviazione. È realizzato utilizzando l'operatore implicit, come definito qui.

Consente di eseguire implicitamente questo tipo di conversioni (da cui il nome).

per ottenere quel tipo di facciata compiuta, ecco come si fa:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ImplicitOperatorTest 
{ 
    class Foo 
    { 
     private string foo; 

     public Foo(string foo) 
     { 
      this.foo = foo; 
     } 

     public static implicit operator string(Foo foo) 
     { 
      return foo; 
     } 

     public static implicit operator Foo(string foo) 
     { 
      return new Foo(foo); 
     } 
    } 

    interface IFoo 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Foo b = "hello"; 
     } 
    } 
} 
Problemi correlati