2016-04-28 9 views
6

私は私の構造を持ってできるように:私はProgram.csのか、別のFile.cs構造を置く、と私はMyType(私の構造)などの変数を作成した場合クラスライブラリが使用割り当てられていない構造が

public struct MyType 
{ 
    private string value; 

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

と私はみてくださいそれを使用すると、結果は明白な誤りである:

CS0165 Use of unassigned local variable

例:

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) 

私は(どちらかの別のプロジェクトで、あるいはNuGetパッケージから)クラスライブラリで構造を入れたときに問題があると私はProgram.csのからそれを使用します。

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

ですが、なぜでしょうか?

+0

2つ目のシナリオでは、出力は何ですか? –

+0

私の答えを訂正しました。(クラスライブラリの一部を見逃してしまいました...申し訳ありません)! @DmitryK。 –

+0

。空の文字列です。質問に追加されました。 – Joe

答えて

2

私が言うことができる限り、これは設計によるものです。 GitHubの上でこの問題を参照してください。

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

この問題は閉じられ、「解像度・バイ・デザイン」と表示されています。その問題で

gafterはこれと言っています

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

しかし、厳密なモード(すべての変数をキャストしなければならない)と構造の間にはどのような関係がありますか? – Joe

+1

@Joeいいえ。 GitHubの問題と同じコメントから、gafterは "これは現在ドキュメントにありません"と言いますが、それはまだ文書化されていないようです。 – reduckted

-1

Console.WriteLineをクラスライブラリから呼び出すと、実行しているプロジェクトがコンソール(コマンドプロンプト)をサポートしていない限り、何も実行されません。デバッグをサポートしていない環境ではDebug.WriteLineと同じです。

+0

これは問題ではありません。 'a.ToString()'を使うと同じ問題があります。タイプがローカルで定義されている場合はエラーがありますが、タイプが別のアセンブリで定義されている場合はエラーはありません。 – reduckted

関連する問題