質問

public class Foo : IFooBarable {...}
public class Bar : IFooBarable {...}

それでは、なぜこれがコンパイルされないのでしょうか...

int a = 1;
IFooBarable ting = a == 1 ? new Foo() : new Bar();

しかし、これは...

IFooBarable ting = a == 1 ? new Foo() : new Foo();
IFooBarable ting = a == 1 ? new Bar() : new Bar();
役に立ちましたか?

解決

:右の式を評価するには、

コンパイラは最初の試み

? new Foo() : new Bar();

は、したがって、これらの2つのエラーメッセージの間には暗黙的な変換はありません。あなたがこれを行うことができます:

IFooBarable ting = a == 1 ? (IFooBarable)(new Foo()) : (IFooBarable)(new Bar());

他のヒント

これは、C#言語仕様のセクション7.13で覆われています。基本的にこのシナリオを殺しているものは、三元オペランドのための2つの値の型間の暗黙的な変換がなければならないということです。この変換は、変数の型のabscenceであると考えられる。

のいずれかFooBarまたはその逆に変換可能でなければならないので。コンパイルエラーが発生したので、どちらではありません。

これらは1つのだけのタイプ(Foo又はBarいずれか)を考慮しているためしかし、後者の2作品。彼らは表現のタイプを決定する同じタイプであるためするのは簡単ですし、それが正常に動作します。

ここに掲載されている正解に少し追加します。この仕様を導き出す設計ガイドラインは 2 つあります。

1つ目は、「内側から外側へ」推論するということです。あなたが言う時

double x = 2 + y;

最初に x の型、次に 2 の型、次に y の型、次に (2+y) の型を計算し、最後に x と (2+y) に互換性のある型があるかどうかを計算します。ただし、2、y、または 2+y の型を決定する際に x の型は使用しません。

これが良いルールである理由は、多くの場合、「受信者」のタイプがまさに私たちが解決しようとしているものだからです。

void M(Foo f) {}
void M(Bar b) {}
...
M(x ? y : z);

ここで何をすればいいでしょうか?オーバーロードの解決を行うには、これが Foo に送信されるのか Bar に送信されるのかを判断するために、条件式のタイプを決定する必要があります。したがって、できません 使用 これは、条件式の型の分析では、たとえば Foo に送られるという事実です。それは鶏が先か卵が先かの問題です。

このルールの例外はラムダ式です。 する コンテキストからタイプを取得します。この機能を適切に動作させるのは非常に複雑でした。私のことを見てください ブログシリーズ 興味があれば、ラムダ式と匿名メソッドについて説明します。

2 番目の要素は、型を「魔法で作り上げる」ことは決してないということです。型を推測しなければならないものがたくさん与えられたとき、私たちは常に実際に目の前にある型を推測します。

あなたの例では、分析は次のようになります。

  • 結果の種類を解明する
  • 代替案の種類を考え出す
  • 結果と代替案の両方に適合する最適なタイプを見つける
  • 条件式の型から、その条件式を使用しているものの型への変換が行われていることを確認してください。

最初の点に従って、私たちは理由を付けません 外側から内側へ;式の型を計算するために、変数の型がわかっているという事実を利用しません。しかし、ここで興味深いのは、

b ? new Cat() : new Dog()

「条件式の型は集合 {Cat, Dog} 内で最良の型である」と言います。「条件式の型は Cat と Dog の両方に対応する最適な型である」とは言いません。それは哺乳類ですが、私たちはそうではありません。代わりに、「結果は実際に見たものでなければならない」と言いますが、これら 2 つの選択肢のうち、どちらが明確な勝者というわけではありません。あなたが言ったら

b ? (Animal) (new Cat()) : new Dog()

次に、動物と犬のどちらかを選択することになりますが、動物が明らかに勝者です。

ここで、この型分析を行うとき、実際には C# 仕様が正しく実装されていないことに注意してください。エラーの詳細については、私の 記事 その上で。

の条件式のタイプは、常に結果が適用されるべきではない変数かられたその2つの部品から推測されるからです。タイプは同じであるか、または一方が他方と互換性の基準である場合、この推論にのみ機能します。この場合、いずれも二つのタイプのうちの他方と互換性の基準である。

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