2017-03-06 1 views
2

私は、次のstringリストを持っている:??ヌルオブジェクト上のオペレータ

string Email = Emails[0] ?? ""; 

は、上記のコードが例外をスローします:

を、それはすべての値を持っているかどうか、または空の文字列を返すようにしようと

List<string> Emails = new List<string>(); 

インデックスが範囲外です。負でなく、コレクションのサイズが 未満である必要があります。パラメータ名:インデックス

しかし、単純なifステートメントに??オペレータを変更する、それが正常に動作します:私はここで何をしないのです

if (Emails.Count > 0) 
    Email = Emails[0]; 
else 
    Email = ""; 

? リストが空の場合、Emails[0]nullではありませんか?

ありがとうございました。私はそれを変更することをお勧め

+4

電子メール[0]リストの最初の項目にアクセスしようとします - それは例外をスローする理由です – Fabio

+2

ここの問題は2つのコードが同等ではありません。2番目の部分では、配列要素 'Emails [0]'にアクセスしようとする前に、配列境界 'Emails.Count> 0'を正しくチェックしています。最初の部分では、ヌル集合演算子を使用してインデックス0の要素がnullかどうかを正しく確認していますが、配列境界を正しくチェックしていない場合は例外です。 –

+1

リストはnullではないので、 '??'を使用することに意味はありません。最初の項目はnullでもなく、最初の項目はありません。 'FirstOrDefault'や二乗的な明示的なチェックを使うとうまくいくでしょう。しかし、最初の項目について気にするなら、 'Queue <>'のようなより適切なコンテナに切り替える方が良いでしょうか? –

答えて

10

:あなたのリストが空の場合は

string Email = Emails.FirstOrDefault() ?? ""; 

Emails[0]がnullではない、それだけで存在していません。

編集:あなたは値の型を持っている場合は、文字列とrefタイプのために働く、例えば、int型のために、あなたは空のコレクションのFirstOrDefault

+0

'FirstOrDefault'は' Emails'に存在しません –

+3

@Koby 'using System.Linq;'名前空間にある 'Enumerable'の拡張メソッドです。 –

+1

@Maksim答えでマークをすばやく消してください!回答の質を向上させたい場合は、OPが提供した2つのコードと問題がどこであったか、ソリューションがどのように彼を助けているかについての説明を提供してください。これは将来この質問の読者に価値をもたらすでしょう。 –

3

Emails[0]の結果として0でデフォルト(int)を取得しますリストの最初の項目にアクセスしようとします。そのため例外がスローされます。

コレクションが問題であること

string Email = Emails.DefaultIfEmpty("").First(); 
0
string Email = Emails[0] 

空である場合は、「デフォルト」の値を宣言するため、「読める」DefaultIfEmptyメソッドを使用することができます。 ??は、その左側のwhatsがnullであるかどうかをチェックし、それに応じて動作します。

空リストにnullのインデックスが0であると誤解されているようです。それは事実ではありません。これら二つのリストは、意味的に非常に異なっている:あなたのコードで

var emptyList = new List<string>(); 
var someList = new List<string>() { null }; 

あなたは空のリストの位置ゼロでアイテムにアクセスしようとしています。このような項目がないため、これは範囲外の例外のインデックスです。 ??演算子が評価される前に例外がスローされます。

0

電子メールを使用すると、存在しない要素0にアクセスすると例外がスローされます。MaksimはEmails.FirstOrDefault()がリストが空であればnullを返します。合併演算子

関連する問題