次のソースを検討してください。
static void Main(string[] args)
{
bool test;
Action lambda = () => { test = true; };
lambda();
if (test)
Console.WriteLine("Ok.");
}
コンパイルする必要がありますよね?まあ、そうではありません。私の質問は、C#標準に従って、このコードをコンパイルする必要があるのか、それともコンパイラのバグなのかということです。
エラーメッセージ:
Use of unassigned local variable 'test'
注:私はエラーを修正する方法を知っています、そして私は部分的に知っています、なぜそれが起こるのですか?ただし、ローカル変数は無条件に割り当てられ、コンパイラはそれに気付くはずですが、気付かないでしょう。なんでだろうか。
回答へのコメント:C#では、割り当てられていない変数を宣言できます。これは、実際には非常に便利です。
bool cond1, cond2;
if (someConditions)
{
cond1 = someOtherConditions1;
cond2 = someOtherConditions2;
}
else
{
cond1 = someOtherConditions3;
cond2 = someOtherConditions4;
}
コンパイラはこのコードを適切にコンパイルします。変数を割り当てないままにしておくと、実際にはコードが少し良くなると思います。理由は次のとおりです。
- これは、値が後で割り当てられることを読者に伝えます(ほとんどの場合、次の条件ステートメントで)
- 内部条件のすべてのブランチに変数を割り当てるようにプログラマーに強制します(最初からこのコードの目的であった場合)。これは、ブランチの1つが変数のいずれかを割り当てない場合、コンパイラーがコードのコンパイルを拒否するためです。
余白について:それはさらに興味深いことです。C++の同じ例を考えてみましょう。
int main(int argc, char * argv[])
{
bool test;
/* Comment or un-comment this block
auto lambda = [&]() { test = true; };
lambda();
*/
if (test)
printf("Ok.");
return 0;
}
ブロックをコメントアウトすると、コンパイルは警告で終了します。
main.cpp(12): warning C4700: uninitialized local variable 'test' used
ただし、コメントを削除すると、コンパイラは警告を発しません。結局、変数が設定されているかどうかを判断できるように思えます。