2

重複の可能性:
C# で条件演算子を使用して結果を入力する

基本的に、次のようなコードがあります。

IEnumerable<Effect> effects = ( ( activeOnly ) ? this.ActiveEffects : this.AllEffects ).Select ( e => e );

どこ:

this.ActiveEffects is:
class ActiveEffectList : IEnumerable<Effect>

this.AllEffects is:
class EffectList : IEnumerable<Effect>

これが、上記のステートメントが機能することを期待していた理由ですが、次のコンパイル エラーが返されます。

「ImageEditor.ActiveEffectList」と「ImageEditor.EffectList」の間に暗黙的な変換がないため、条件式のタイプを判別できません

4

4 に答える 4

1

クラスは両方とも同じベース (IEnumerable) から継承されていますが、実装が異なる可能性があります。代入演算子の前に、三項演算子は最初に 2 つの値の間で共通の型を返す必要があり、b を a に変換することはできません。

参照によると:

http://msdn.microsoft.com/en-us/library/ty67wk28.aspx

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

次のいずれかを行います。

IEnumerable<Effect> effects = ( ( activeOnly ) ? (IEnumerable<Effect>)this.ActiveEffects : this.AllEffects ).Select ( e => e );

または、暗黙的な変換演算子をクラスに追加します。

http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx

于 2011-02-01T20:37:44.957 に答える
1

最初の値を にキャストすることで、この問題を解決できますIEnumerable<Effect>

var effects = activeOnly ?
              (IEnumerable<Effect>) this.ActiveEffects :
              this.AllEffects;

問題は、IEnumerable に代入している場合でも、キャストが発生する前にコンパイラが条件式を評価する必要があり、条件ステートメントが同じ型を返すために両方のパスを必要とするため、AllEffectsキャストできないエラーが発生することです。にActiveEffects

ステートメントの最初の値を IE にキャストすることにより、より具体的なタイプの 1 つではなくnumerable<Effect>、条件ステートメントを強制的に返すことになります。IEnumerable<Effect>

于 2011-02-01T20:23:29.290 に答える
1

型を解決するときに、基本型または左側の型を調べないためです。

これを解決するには、ステートメントを次のように変更します。

IEnumerable<Effect> effects = ( ( activeOnly ) ? (IEnumerable<Effect>)this.ActiveEffects : this.AllEffects ).Select ( e => e );
于 2011-02-01T20:23:40.510 に答える
1

三項式は式であり、式には型があるためです。コンパイラは、最も近い一般的な代入互換型を見つけようとしません (そのような検索は非常に複雑になる可能性があり、通常はほとんど価値がないため)。あなたの場合、2 つの完全に異なるタイプがあります。すべての型 (一般に、安全でないブロックの外側) は に共通の祖先を持ってobjectいますが、コンパイラはチェーンを検索しません。2 つのタイプが少なくとも 1 つの方向で割り当ての互換性を持たない場合は、必要なものを指定する必要があります。

簡単な解決策は、オペランドの 1 つを目的の型にキャストすることです。これにより、コンパイラは他のオペランドをその型と比較するように指示され、すぐに互換性があると見なされます。つまり、1 つのオペランドを にキャストしIEnumerable<T>ます。

于 2011-02-01T20:23:42.513 に答える