周りを検索した後、C#コンパイラがローカル変数dteDestが行に割り当てられていないことを訴えている理由を見つけることができないようです
if (dteSrc == dteDest) {
行を置き換えるとエラーはなくなります
DateTime dteSrc, dteDest;
と
DateTime dteSrc, dteDest = DateTime.MinValue;
私が見る限り、dteDestがoutパラメーターであるDateTime.TryParseによって初期化されていない場合、コードは比較行に到達しません。
私の論理は次のとおりです。
- currentDataObjがnullの場合、booHaveOrigDateはfalseであり、失敗した場合は最初の
- currentDataObjがnullではないが、DateTimeに変換できない場合、booHaveOrigDateはfalseであり、失敗した場合は最初の
- DateTime.TryParseは、これを&&とともにDateTimeに変換できない場合、falseを返します。これは、dteDestが使用されないことを意味します。
簡単なサンプルコード
void StrangeLogic(object srcData, object currentDataObj) {
DateTime dteSrc, dteDest;
bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
bool booHaveOrigDate = (currentDataObj != null)
&& DateTime.TryParse(currentDataObj.ToString(), out dteDest);
if (booHaveNewDate && booHaveOrigDate) {
if (dteSrc == dteDest) {
// Get a "use of unassignned local variable 'dteDest'
// unless dteDest = DateTime.MinValue beforehand
}
}
}
また、行を変更した場合
bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
次へ
bool booHaveNewDate = (srcData != null) && DateTime.TryParse(srcData.ToString(), out dteSrc);
次に、コンパイラはsrcDateも割り当てられていないと文句を言います。
誰かが私が欠けているものを正しい方向に向けることができますか?私はパラメータチェックなどについては意味しません私はコンパイラロジックが一般的なTryParse関数の使用によってだまされているように見える理由を心配していますか?
追加情報
ロジックを拡張しても同じエラーが発生します(割り当てられていないローカル変数の使用)
bool booHaveOrigDate;
if (currentDataObj != null)
booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest);
else
booHaveOrigDate = false;
if (booHaveOrigDate) {
if (dteSrc == dteDest) {
コンパイラがnullチェック(currentDataObj!= null)を使用して行うことは、割り当てられていない限りdteDestがアクセスされないと正しく判断できないように見えます。
これをこのコードに変更し、問題はありません(nullオブジェクトで発生する可能性のある.ToString()を除く)
bool booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest);
if (booHaveOrigDate) {
if (dteSrc == dteDest) {