2013-07-21 9 views
13

私はちょうどFirstOrDefault()の戻り値の種類が選択されている要素の値に応じて異なりますことを説明したSO postを読んでいます。IntおよびIntでのFirstOrDefaultの動作

例:この例では

ICollection<String> list = new List<String>(); 
list.Add("bye"); 

int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 

intデフォルト値はしかし、私はするために既にリンクされたポストに従って.Cast<int?>()を追加することができ0

あるので、aが0に等しくなりますクエリーが0の結果を返すときはnullを取得します。私の最初の例のために、私はNull許容int型(int?)ではなく、通常のintを使用する場合、私はコンパイル時エラー(または少なくとも警告)を取得しないのはなぜ

int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault(); 

私が正しく理解していれば、私の最初のクエリを実行するときint?を使用すると、nullの値では決して結果をます。私の最初の例のために、私は、その後のNullable intではなく、定期的なintを使用する場合、私はコンパイル時エラー(または少なくとも警告)を取得しないのはなぜ

+2

あなたの質問は私には分かりません。どのような正確なコードは、エラー/警告を予期した場所で警告なくコンパイルしますか? 'int'のdefalt値は' 0'で、 'int'のdefalt値は' null'です。 –

+0

こんにちは@JeppeStigNielsen - 私は上記の 'int?'の例のために、 'null'が返されることはないのに、コンパイラがNullable型を使用させる理由を混乱させました。 'dasblinkenlight'は私の質問に完全に答えました。 –

答えて

9

? 私が正しく理解している場合は、intを使用しますか?私の最初のクエリを実行すると、値はnullになることはありません。

ご理解の方が正しいです。ただし、変数aを「拡大」変換であるため、コンパイラは変数aを宣言したいという邪魔をしません.LINQクエリの代入は決してnullを返しませんが、同じ変数down以下:

int? a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 
// Do something with `a`, which will not be null 
... 
a = null; 
if (someCondition) { 
    a = someNotNullValue(); 
} 
// Here, a may or may not be null 
... 
+0

[脇に]複数の場所で変数 'a'を使用することに反対しないでしょうか?私はコードコンプリートと経験から思い出しているように、変数のスパンを増やすと読みやすくなります。 –

+3

@Kevin密接に関連する目的のために変数を再利用しない限り、私は変数を再使用しないことを主張する最初の人になります。しかし、コンパイラは、ベストプラクティスを実施する責任を負うべきではありません。プログラマが自分に言いたいことに従わなければならないので、プログラマは自分のプログラムの可読性というような「重要ではない」ことを心配しなければなりません。 – dasblinkenlight

+0

思慮深い言葉をありがとう。 –

関連する問題