Use of unassigned local variable の原因と直し方
ローカル変数は宣言しただけでは値を持ちません。条件分岐をまたいだ使用で見落としがちなエラーです。
エラーメッセージの読み方
Program.cs(4,34): error CS0165: Use of unassigned local variable 'count'
Program.cs- ファイル名
4- 行番号
34- 列番号 — この位置でコンパイラが解析に失敗しました
CS0165- エラーコード — 検索するとMicrosoftの解説ページが見つかります
Use of unassigned local variable 'count'- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 class Program { 2 static void Main(string[] args) { 3 int count; ^ 4 System.Console.WriteLine(count); 5 } 6 }
Program.cs(4,34): error CS0165: Use of unassigned local variable 'count'
ローカル変数はJavaと違いデフォルト値を持ちません。宣言しただけでは未代入のままです。
直し方: ; を = 0; にします。
広告
広告スロット(未設定)
パターン2
1 class Program { 2 static void Main(string[] args) { 3 string name; ^ 4 System.Console.WriteLine(name); 5 } 6 }
Program.cs(4,34): error CS0165: Use of unassigned local variable 'name'
参照型のローカル変数も未代入のままでは使えません。nullで初期化することはできますが空文字とは違います。
直し方: ; を = ""; にします。
パターン3
1 class Program { 2 static void Main(string[] args) { 3 int a; 4 if (args.Length > 0) { 5 a = 1; 6 } 7 System.Console.WriteLine(a ); ^ 8 } 9 }
Program.cs(7,34): error CS0165: Use of unassigned local variable 'a'
args.Lengthは実行するまで分からない値です。コンパイラはif文が必ず実行されるとは判断できないため、aが確実に代入される保証がないとみなします。
直し方: a を 1 にします。
パターン4
1 class Program { 2 static void Main(string[] args) { 3 double price; ^ 4 System.Console.WriteLine(price); 5 } 6 }
Program.cs(4,34): error CS0165: Use of unassigned local variable 'price'
double型でも規則は同じです。宣言しただけでは未代入のままで、使う前に初期値が必要です。
直し方: ; を = 0.0; にします。
パターン5
1 class Program { 2 static void Main(string[] args) { 3 bool flag; 4 if (args.Length > 0) { 5 flag = true; 6 } 7 System.Console.WriteLine(flag ); ^ 8 } 9 }
Program.cs(7,34): error CS0165: Use of unassigned local variable 'flag'
if文が必ず実行されるとはコンパイラは判断できないため、flagが確実に代入される保証がないとみなされます。
直し方: flag を true にします。
よくある誤解
C#のローカル変数はJavaのフィールドと違ってデフォルト値を持ちません。条件分岐の中でしか代入されない変数は、実行時ではなくコンパイル時に弾かれます。
実務での勘所
この検査は「確実な代入(definite assignment)」と呼ばれる、コード上のすべての分岐経路を辿って値が入っているかを機械的に追跡する解析です。if文とelse文の両方で代入していれば、宣言時に初期値を与えていなくても検査は通ります。逆に、片方の分岐だけで代入し、もう片方で代入していなければ、実行時にその経路を通らなくても、コンパイル時点で一律にエラーとして扱われます。