2017-07-11 12 views
-7

私はこの条件nullの場合、null条件演算子はfalseを返しますか?

if (item?.Value2?.GetType() != typeof(string) && item.get_Value() == 0)

Iアイテムがnullの場合?.操作私は短絡状態を引き起こすfalseように解決されると信じている、nullが返され、すべてが良好であると考えている(item.get_Value()私は確かではないよしかし、私はそう

if (item?.Value2?.GetType() ?? 0 != typeof(string) && item.get_Value() == 0)

のようにそれを行う必要があるかもしれないと思った

)と呼ばれることはありません

しかし、私はそれが過剰な可能性があると思う、潜在的なnull参照の例外から安全な最初の方法ですか?

+8

:最初の0のセルを見つけるために、実際の問題については


(それは範囲を列挙した結果である場合には項目がnullではありません) 。いつでもコンパイラを起動してテストすることができます。 –

+0

は単セルのExcel範囲のアイテムですか?セルの値が0であるか、表示された書式設定されたテキストが "0"であるかをチェックしますか?それは過剰なもので、多くのエッジケースが欠けています。 – Slai

+4

1. [ドキュメントを読む](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators)および/または2.なぜそれを試してみませんか自分のために参照してください? –

答えて

5

item?.Value2?.GetType()itemnullまたはValue2nullである場合nullを返します。

引き起こす第1の条件はtrueとして解決される

if (null != typeof(string) && item.get_Value() == 0) 

あろう評価条件をNullReferenceExceptionitem.get_Value() == 0が実行されるとき

+0

@RufusL 'null!= typeof(string)'は 'true'と評価されます – Alberto

+0

@hellyaleそれは' get_Value() 'の戻り値は何ですか? – Alberto

+0

@hellyale 'item'が' null'なら 'item?.get_value()'は 'null'を返し、' item ?.get_Value()== 0'は 'false'に評価します – Alberto

1

.Value2(しかしitemnullはなくValue2場合にのみ)日付または通貨としてフォーマットされたセルの場合、.Value2はDoubleを返しますが、.Valueまたは.get_Value() return DateTim eと小数です。両方が数値型の場合はDoubleになり、値が数値型でない場合は文字列、テキストとして書式設定された数値になります。戻り値の型は、TRUEおよびFALSEの場合はブール値、エラーの場合はIntegerにすることもできます。


if (0.0.Equals(item.Value2)) // if (item.Value2 is Double && (Double)(item.Value2) == 0.0) 

これは奇妙に見えるかもしれませんが、それは実行時0.0からtype is Double and equalかどうかを確認するために最短かつ最も安全な方法です。プログラミングでの「信念」の必要はありません

Range cell = range.Find(0, LookAt: XlLookAt.xlWhole); 
if (cell != null) { /* ... */ } 
関連する問題