2016-04-28 12 views
6

ich meine Struktur haben:Klassenbibliothek ermöglichen die Verwendung nicht zugeordnete Strukturen

public struct MyType 
{ 
    private string value; 

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

Wenn ich die Struktur in Program.cs oder anderen File.cs setzen, und ich eine Variable als MyType (meine Struktur) und ich versuche, zu benutzen, ist das Ergebnis ein offensichtlicher Fehler:

CS0165 Use of unassigned local variable

Beispiel:

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) 

Das Problem ist, wenn ich die Struktur in einer Klassenbibliothek setzen (entweder in einem anderen Projekt oder von einem NuGet-Paket) und ich benutze es von Program.cs:

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

Warum ist das passiert?

+0

Was die Produktion im zweiten Szenario ist? –

+0

Korrigiert meine Antwort (total verpasst der Class Library Teil ... Entschuldigung)! –

+0

@DmitryK. Eine leere Zeichenfolge. Der Frage hinzugefügt. – Joe

Antwort

2

Soweit ich das sagen kann, ist dies von Entwurf. Sehen Sie dieses Problem auf GitHub:

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

Dieses Problem wurde geschlossen und etikettiert als "Resolution-By Design".

In dieser Frage, gafter hat folgendes zu sagen:

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

Aber welche Beziehung besteht zwischen dem strikten Modus (muss alle Variablen darstellen) und initialisiert keine Struktur? – Joe

+1

@Joe Keine Ahnung. Aus demselben Kommentar in der GitHub-Ausgabe sagt Gafter "Dies ist derzeit nicht in den Dokumenten" und es scheint immer noch, dass es nicht dokumentiert ist. – reduckted

-1

Wenn Sie aus einer Klassenbibliothek aufrufen, sofern das von Ihnen ausgeführte Projekt keine Konsole (Eingabeaufforderung) unterstützt, wird nichts unternommen. Dasselbe gilt für Debug.WriteLine in einer Umgebung, die Debugging nicht unterstützt.

+0

Das ist nicht das Problem. Die Verwendung von 'a.ToString()' hat das gleiche Problem - der Fehler ist vorhanden, wenn der Typ lokal definiert ist, aber nicht, wenn der Typ in einer anderen Assembly definiert ist. – reduckted

Verwandte Themen