2012-03-15 7 views
7

以下では、文字列一致を入力するだけで、 "割り当てられていないローカル変数 'match'の使用" というコンパイル時エラーが表示されます。私は文字列の一致= nullを使用すると動作します。 違いは何ですか?一般的に、文字列に値を割り当てていない場合、このようにnullに割り当てる必要がありますか?nullに変数を代入すると何が行われますか?

string question = "Why do I need to assign to null"; 
char[] delim = { ' ' }; 
string[] strArr = question.Split(delim); 
//Throws Error 
string match; 
//No Error 
//string match = null; 
foreach (string s in strArr) 
{ 
    if (s == "Why") 
     { 
     match = "Why"; 
     } 
} 
Console.WriteLine(match); 
+0

コンパイラはあなたがそれを意味していることを知りたがっています: – Jodrell

+0

まだStackOverflowにいくつかの回答があります:ただ一つ - > http://stackoverflow.com/questions/256073/c-sharp-error-use-of-unassigned -local-variable – AngeloBad

答えて

12

C#言語は、値が確定的に割り当てられるまでローカルの使用を防ぎます。この例では、コンパイラはSplitのセマンティクスを理解しておらず、strArrは空のコレクションになる可能性があるため、ループの本体が実行されない可能性があります。つまり、決定的な割り当ての観点から、foreachmatchに値を割り当てません。したがって、あなたが到達したときにまだ割り当てられていませんWriteLine

宣言をstring match = nullに変更すると、値は最初から明確に割り当てられたものとしてマークされます。したがって、ループ計算は関係ありません

4

あなたは宣言と割り当ての違いを見出しています。単に

string match; 

ような行との宣言では、あなたが文字列型の変数matchを使用するコンパイラにを宣言します。

match = null; 

ような行と割り当ては、割り当てmatchからnull

宣言と代入を常に分離する必要があることを宣言することは可能ですが(100%はわかりませんが、古いバージョンのVisual Basicではこれが行われていると思いますが)ほとんどの言語で宣言そして

string match = null; // combined declaration and assignment 

書き込み割り当ては、

string match; // declaration 
match = null; // assignment 

C#は、彼らが使用される前に、変数を割り当てる必要が意味します。フィールドやイベントとは異なり、ローカル変数にはデフォルト値が自動的に割り当てられないため、matchを使用する前に、matchに値があることをコンパイラーに証明する必要があります。コンパイラは、その変数がstring型である限り、どの値のmatchに関わらず気にしません。あなたのケースでは

、コンパイラは、コンパイラがSplitのコードを検査していないためstrArrが空になると地元の分析と証明することはできないので、コードもforeachループに入るという保証はありません、聞かせて一緒にmatchに割り当てる条件を満たす。 Console.WriteLineコールではmatchが使用され、matchは実行時にstring match宣言で割り当てられない可能性があるため、matchをループ外に割り当てる必要があります。この要件を満たす1つの方法は、string matchの代わりにstring match = nullを使用することです。

0

状態がtype variable = null;のときは、変数を初期化しています。 type variable;と記載している場合は、変数のみを宣言しています。

+0

は 'variable = null'にする必要があります。 - double ==は等価コンパレータ – Haedrian

+0

を修正しました。あまりにも熱心だった..... –

2

コンパイラは、matchを何も割り当てずに使用できる可能性があることを認識しました。 foreachループが実行されることはありません。だからあなたは変数を宣言しましたが、コンパイラはそれが割り当てられることなくアクセスできることを認識しています。したがって、エラーです。

5

があなたのシナリオに依存し、しかし:

string match = null; 

または:

string match = string.Empty; 

は両方の許容プラクティスです。

matchには値が割り当てられないことがあります。したがって、コンパイラエラーです。

1

条件が満たされた場合、変数 '一致'を初期化するif()ブロックがあります。その場合、matchはメモリ内の実際のブロックを表すオブジェクトです。

if()条件が満たされない場合、 'match'変数のデフォルト初期化を行う 'else'ブロックがありません。この場合、初期化されていないものにアクセスしようとしますオブジェクトは失敗します。

次の方法でこの問題を回避することができます:デフォルトのforループの前に「一致」を初期化し、コメントしたよう

  1. forループの後にデフォルトの 'else'条件を追加します。

幸いなことにIDEで作業している場合、これはコンパイル例外としてあなたに指摘しています。

関連する問題