あるのに良い理由ternariesアプリケーションには制限はありますか?

StackOverflow https://stackoverflow.com/questions/1669492

  •  13-09-2019
  •  | 
  •  

質問

失敗した:

object o = ((1==2) ? 1 : "test");

成功す:

object o;
if (1 == 2)
{
    o = 1;
}
else
{
    o = "test";
}

エラーの文:

タイプの条件式の判定できないのではない暗黙的に変換'int'および'文字列'.

なぜとする必要があるが、私の提供価値に変数の型オブジェクトです。

編集: 上の例は自明であるが、その事例もあるこの非常に役に立:

int? subscriptionID; // comes in as a parameter

EntityParameter p1 = new EntityParameter("SubscriptionID", DbType.Int32)
{
    Value = ((subscriptionID == null) ? DBNull.Value : subscriptionID),
}
役に立ちましたか?

解決

使用する:

object o = ((1==2) ? (object)1 : "test");

問題は、条件付き演算子の返品タイプを曖昧に決定できないことです。つまり、intとstringの間には、最良の選択はありません。コンパイラは常に真の式のタイプを使用し、必要に応じて誤った式を暗黙的にキャストします。

編集:あなたの2番目の例:

int? subscriptionID; // comes in as a parameter

EntityParameter p1 = new EntityParameter("SubscriptionID", DbType.Int32)
{
    Value = subscriptionID.HasValue ? (object)subscriptionID : DBNull.Value,
}

PS:
それは「三元演算子」とは呼ばれません。これ 三元演算子ですが、「条件演算子」と呼ばれます。

他のヒント

が、他の回答 正しい, ようになったという意味のようtrueおよび関連する諸表におい微妙なポイントの言語でデザインがここにない表現されています。多くの要因に貢献し、現在のデザインの条件付きます。

このような望ましいとして多くの表現として明白なプライベートタイムを決定しみに内容は異なるアイコンで表示されます。このことが望ましいくつかの理由があります。例えば:この構築を行頭に付けたエンジンをより簡単にするものである。きタイプ x.M(some-expression. とを行頭に付けたニーズを分析することができる 一部の表現, を決めて、その種類をドロップダウンの前を行頭に付けたかよくご存知の方法。Mさします。を行頭に付けませんか。Mとい場合のMは過負荷でトヨタグループをはじめ、世界のすべての引数がなを入力しても最初の引数はまだない。

第二に、お好みのタイプの情報を流し"外部"からのシナリオが、先ほど申し上げたように:過負荷。以下を考えます:

void M(object x) {}
void M(int x) {}
void M(string x) {}
...
M(b ? 1 : "hello");

どうすればこのかがですか?そのオブジェクト過負荷?その時に電話文字列の過負荷時のint過負荷?何をした場合は別の過負荷という M(IComparable x) --どのような場合にお渡しですか?

く非常に複雑な時種別情報"の流れの両方"."と私の提供するものは、変数の型オブジェクトのためのコンパイラが知るべきでOKの選べるオブジェクトしてさかのぼって三日目に当たる"な洗;する場合も多いので 私たちにもわかりませんの種類の変数だけ配が我々の過程を.過負荷分解能での工程の作業の種類のパラメータの変数についても書いてください。格の引数の種類の引数になります。の場合の種類の引数をタイプするように配属され、そして真円度当社の誇張しています。

種別情報は"流れの両方"のためのラムダ仕様の表現を実施するに当たりの効率的に行ったにない場合があります。長々と書きましたが、長いシリーズの記事を記述するのに困難を計画-実行コンパイラることができない分析がタイプ情報のフローにより複雑な表現に基づくコンテキスト表現は、クリーンエネルギーである要求されるもの第一部はこちら:

http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx

だと言われるかもしれませんが、OK、なぜこんに配るオブジェクトでも安心してご使用いただける、コンパイラによって、私の見解ではなぜでに必要な表現において明白なタイプが、なぜできないのではないでタイプを表現オブジェクトはintと文字列の転換できるオブジェクト" このよう第三のポイント:

第三に、微妙なものを一貫して応用デザインの原則にC#で"作るな種類のファスナー<マジック".が指定されたときに、リストの表現がなければならない定型 タイプが判断したものリストのどこかに.いたしませんの魔法の新しいタイプを選択します。のだとして度々取り上げられていることをやりくりは夫婦で別にされていませます。というと最型セットの種類、最適なタイプがセットです。セットになっ{int,string}がない最高のスーパーミリオンヘアーのあと、"動物メート哺乳動物ワラビーや".このデザイン決定の条件オペレーター、型推論の統合のシナリオは、推論の暗黙のうちに入力配列の型です。

このデザインが決定することになったことで、普通の人間はどのような動作するように、のコンパイラはいえ、ベストタイプを判断する必要があ;いさせていただきます。が見いの顔を選んでくすいてしまうだろう。

でも避けくと多くの複雑なルールに何を最も一般的なタイプのセットの種類があります。い種類{Foo、Bar、お}は、授業を実施IBlah、両方の授業を受け継ぐらBaz.るのが普通タイプ、IBlah、その両方を実施し、Bazできることの延長は?いてこのような疑問に答えるため;い動きが出始めている。

最後に、このC#コンパイラの実際の判定の種類の微妙に違いあ曖昧である。私の最初の記事はこちら:

http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-inference-woes-part-one.aspx

この議論の余地が実際のコンパイラはこのスペックが間違ってい;の実装をデザインが私の意見より、仕様思います。

とにかくことになるか理由にデザインのこの特定の側面は、複ります。ありその他の機微ここでは、例えば、どのようにCLR検証者かどうかを判定し定の分岐経路の確に正しいタイプのスタックです。議論する詳しいもので遠方の地.

なぜこの方法で機能Xが答えるのが非常に難しい質問なのか。実際の動作に答える方がはるかに簡単です。

理由についての私の教育を受けた推測。条件付き演算子は、ブール式を簡潔かつ激しく使用して、2つの関連する値を選択することができます。それらは単一の場所で使用されているため、関連している必要があります。代わりに、ユーザーが2つの無関係な値を選択した場合、おそらくそこのコードに微妙なタイプミス /バグがあり、コンパイラは暗黙的にオブジェクトにキャストするのではなく、これを警告する方が良いでしょう。彼らが期待していなかったものかもしれません。

「int」はプリミティブタイプであり、「文字列」はより「原始オブジェクト」と見なされている間、オブジェクトではありません。 「Object O = 1」のようなことをすると、実際に「int」を「int32」にボクシングします。これがボクシングに関する記事へのリンクです:

http://msdn.microsoft.com/en-us/magazine/cc301569.aspx

一般的に、パフォーマンスの失loseが追跡するのが難しいため、ボクシングを避ける必要があります。

三元式を使用する場合、コンパイラは割り当て変数をまったく見て、最終タイプが何であるかを判断しません。元の声明をコンパイラーがしていることに分類するには:

ステートメント:オブジェクトo =((1 == 2)?1: "test");

コンパイラ:

  1. ((1 == 2)?1:「テスト」)の「1」と「テスト」のタイプは何ですか?彼らは一致しますか?
  2. #1の最終タイプは、「オブジェクトO」の割り当て演算子タイプと一致しますか?

コンパイラは#1が完了するまで#2を評価しないため、失敗します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top