5

条件param.daysが文字列の場合、次のようになります。

if (param.days != null)

これはうまくいきますが、私が言うなら

If (param.days)

実行時に正しく評価されません。C# では、両方のステートメントは同じではありません。
値がnullであると言っていますが、C#はそれをnull不可のboolにキャストしようとします。 C# の設計者がこの方法を選んだのはなぜですか? このようなステートメントは C++ では有効ですが、C# では有効と見なされないのはなぜですか?

4

6 に答える 6

18

このようなステートメントは C++ では有効ですが、C# では有効と見なされないのはなぜですか?

C# は異なる言語規則を想定しているためです。ゼロか非ゼロか、null か非 null かをチェックすることで、すべての数値/参照をブール値として扱うことができるとは限りません。何かが null かどうかをテストする場合: null かどうかをテストします

注:daysが実際にT?(aka Nullable<T>) である場合は、以下を確認できます。

if(param.days.HasValue)

これは次と同じですif(param.days != null)

または、型適切にブール値として扱うことができる場合は、コンパイラにそれを伝えるためにオーバーライドできる演算子があります。

于 2013-07-29T10:51:21.430 に答える
6

C# は C++ とは異なり、integer を bool に暗黙的にキャストしません。

于 2013-07-29T10:52:52.123 に答える
1

C# のIfステートメントでは、ブラッカーの内容がブール式である必要があります。

を考慮してくださいIf ("Hello World")

「Hello World」は真か偽か? どちらでもない、文字列です。

.Any()たとえば、If (myListOfCats.Any()).days プロパティはオブジェクトのコレクションを意味するため、LINQ 式を検討することをお勧めします。

于 2013-07-29T10:51:27.700 に答える
1

if ステートメントでの比較は、ブール値の結果に評価される必要があります。param.days はブール値ではありません。ブール値の結果を得るには、値を null と比較する必要があります。C# はタイプ セーフです。

于 2013-07-29T10:52:02.457 に答える