2016-04-28 34 views
6

ho la mia struttura:biblioteca Classe consentire strutture non assegnati uso

public struct MyType 
{ 
    private string value; 

    // Methods 
    // ... (ToString overrided too) 
} 

Se metto la struttura in Program.cs o in un altro File.cs, e creo una variabile come MyType (mia struttura) e cerco usarlo, il risultato è un errore evidente:

CS0165 Use of unassigned local variable

Esempio:

MyType a; 
Console.WriteLine(a); // Error: Use of unassigned local variable 'a' 

MyType b = new MyType(); 
Console.WriteLine(b); // Prints the default value (an empty string) 

Il problema è quando ho messo la struttura in una libreria di classi (o in un altro progetto, o da un pacchetto NuGet) e lo uso da Program.cs:

MyType a; 
Console.WriteLine(a); // No error: prints an empty string 

Perché succede questo?

+0

Qual è la produzione nel secondo scenario? –

+0

Corretto la mia risposta (totalmente mancata la parte della Biblioteca di Classe ... scusa)! –

+0

@DmitryK. Una stringa vuota. Aggiunto alla domanda. – Joe

risposta

2

Per quanto posso dire questo è di progettazione. Vedere questo problema su GitHub:

'error CS0165: Use of unassigned local variable' is not produced for structs with a private reference type field from a different assembly

Questo problema è stato chiuso ed etichettati come "Risoluzione-By Design".

In tale questione, gafter ha questo da dire:

This was a very painful but intentional decision. This duplicates the (buggy) behavior of the previous compiler. I strongly recommend you add the compiler flag /features:strict to get the correct, specification-required (but not backward-compatible) behavior.

+0

Ma quale relazione esiste tra la modalità strict (deve cast tutte le variabili) e non inizializzare una struttura? – Joe

+1

@Joe Nessuna idea. Dallo stesso commento nel problema GitHub, gafter dice "Questo non è attualmente nei documenti" e sembra ancora che non sia documentato. – reduckted

-1

Quando si chiama Console.WriteLine da una libreria di classi, a meno che il progetto in esecuzione supporti una console (prompt dei comandi), non farà nulla. È lo stesso per Debug.WriteLine in ambiente che non supporta il debug.

+0

Questo non è il problema. L'uso di 'a.ToString()' ha lo stesso problema - l'errore è presente quando il tipo è definito localmente, ma non lì quando il tipo è definito in un altro assembly. – reduckted