0

?:代わりに演算子を使用したいif else

例えば

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}
else 
{
    // do nothing
}

私は?:このように使用しようとしました:

var directory = new DirectoryInfo(path);
!directory.Exist() ? directory.Create() : void;

しかし、「無効な表現用語void」と表示され、nullこれも機能しません。

誰でも解決策を教えてもらえますか?

4

7 に答える 7

3

あなたのシナリオでは、if条件があるだけの方が適しています。

あなたの理解のために、三項演算子(?:)は右側の値になる必要があり、結果の値を割り当てるために左側の変数も必要です。

    x =  (y== null) ? 0: 1;

これは、それ以外の場合は assign0に割り当てることを意味します。xy is null1

したがって、例/シナリオでは、次のようなものを記述して、次のようなディレクトリ作成ステータスにすることができます。

    var newDirectoryCreated = (!directory.Exist()) ? directory.Create() : false;

このように、新しいディレクトリが作成された場合は、それ以外の場合newDirectoryCreatedに割り当てられtrueますfalse

于 2012-11-04T08:00:11.920 に答える
2

そこでは何もしていないので、ifステートメントをそのままにしてクラスを削除するだけです。else

定義により、値を返す必要がある三項演算子を使用しようとしています。

ドキュメントから:

条件演算子 (?:) は、ブール式の値に応じて 2 つの値のいずれかを返します。

于 2012-11-04T07:59:41.977 に答える
2

三項演算子は置き換えるようには設計されていませんif/else。代入と宣言を簡素化するためのものです。ステートメントの結果を変数や関数などに割り当てることができるはずです。主な用途は課題や読書です。

何かのようなもの

var status = !directory.Exist() ? directory.Create() : false;

正しい解決策は、本来の状態に固執することですif。以下で十分です。

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}
于 2012-11-04T08:01:41.327 に答える
2

簡潔さを求めているだけなら、代わりにこれを試すことができます:

if (!directory.Exist())
    directory.Create();
于 2012-11-04T08:04:33.507 に答える
1

条件演算子(?:) は、ブール式の値に応じて 2 つの値のいずれかを返す必要があります。したがって、代わりに句を使用できますif。条件演算子ではなく、理解するのは簡単です。

var directory = new DirectoryInfo(path);
if (!directory.Exist()) directory.Create();
于 2012-11-04T08:00:43.283 に答える
1

オペレーターの?:動作は、おおよそ次のとおりです。

forの場合、が true の場合はx ? y : zを返し、それ以外の場合は を返します。yxz

このことから、いくつかのことが推測できます。

  • yとの両方が何かzを返さなければなりません(どちらかが に評価された場合は機能しません)。void
  • y同じzに評価される必要があります。(次のようなものがあると想像してください: . r はどの型ですか? orの型ですか? どちらが返されるかはわかりませんが、コンパイル時に型を選択する必要があります。同じタイプ。var r = x ? y : z;yz

あなたの場合、両方とも に評価されますがvoid、これは機能しません。(そして、あなたnullが試したと言ったように、最後の部分を に変更した場合、それらは異なるタイプに評価され、そのうちの1つは無効であり、両方のルールに違反します)

于 2012-11-04T08:05:21.090 に答える
0

?: 演算子は、if-then-else 構造の拡張です。

拡張は then ブロックと else ブロックにあります。then-block と else-block が if-then-else コンストラクトに対して void を返す場合、?: 演算子の型を返す必要があります。?: 演算子の型に対する追加の制約は、2 つの型が同一でなければならないということです。この制約は、2 つの型を同一にするためにコンパイラによって自動キャストが使用されるという事実によって少し緩和されます。

?: 演算子を使用したコードは、一般に短くなりますが、読みにくくなります。これは、if-then-else コンストラクトを ?: 演算子に置き換える際に考慮すべき 1 つのポイントです。then-block と else-block が 1 つのライナーでない限り、それを ?: 演算子に置き換える価値はほとんどありません。

if-then 構文は、if-then-else 構文の限定バージョンです (またはその逆、if-then-else 構文は if-then 構文の拡張です)。if-then 構造には then ブロックという 1 つのコード ブロックしかないため、if-then 構造を ?: 演算子に置き換えることはできません。最初に、if-then コンストラクトを空の else ブロックで拡張する必要があります。

例:

// initialising an integer with an if-then construct.
int x = 0;
if (some_condition)
{
    x = 1;
}

これは、then ブロックが整数を返すかのように考えてください。?: 演算子を直接使用することはできません。

// initialising an integer with an if-then-else construct.
int y;
if (some_condition)
{
    y = 1;
}
else
{
    y = 0;
}

if-then コンストラクトを if-then-else コンストラクトに拡張し、then-block と else-block を整数を返すと考えて、タイプが一致するようにします ;-) 互いに一致します。この場合、?: 演算子を使用できます。

// initialising an integer with a ?: operator.
int z = (some_condition) ? 1 : 0;

コードについて:

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}

この場合、then-block が値を返すようにする賢明な方法がわかりません。その結果、?: 演算子の使用が不可能になるか、非常に複雑になり、醜いコードになります。私のアドバイスは、この場合は if-then 構造に固執することです。

于 2012-11-04T12:29:09.427 に答える