質問

から MSDN:

不要なキャストを排除することで、暗黙的な変換によりソース コードの可読性が向上します。ただし、暗黙的な変換はプログラマが指定しなくても発生する可能性があるため、不愉快な事態を避けるために注意する必要があります。一般に、暗黙的な変換演算子は、プログラマが意識することなく安全に使用できるように、例外をスローしたり、情報を失わないようにする必要があります。変換演算子がこれらの基準を満たすことができない場合は、明示的としてマークする必要があります。

私は特定の点に同意するわけではなく、これがすべて非常に良いことであることに同意しますが、暗黙的な変換が例外をスローしないという部分を破るのに十分な理由があるでしょうか?

私の目の前にある具体的なケースは次のようなものです。

  1. カスタムコレクションオブジェクトを返す関数があります(これを次のように呼びます) FooCollection).
  2. この関数は単一の項目を含むコレクションを返すことができます。 これが起こるかどうかはソースコードから判断できます. 。(これは、関数自体ではなく、関数呼び出しのみを意味します)
  3. そうなった場合、99.9% の確率で、ユーザーは 1 つのアイテムを含むコレクションではなく、その 1 つのアイテムを望んでいます。

今、からの暗黙的な変換を含めるかどうかを検討中です。 FooCollection => Foo この小さな実装の詳細を非表示にしますが、この変換はコレクション内に 1 つの項目が存在する場合にのみ機能します。

投げても大丈夫ですか? Exception この場合?それとも代わりに明示的なキャストを使用する必要がありますか?これに対処する方法について他にアイデアはありますか (いいえ、実装の詳細により、2 つの関数だけを使用することはできません)。

編集: それは注目に値すると思う FooCollection インターフェースを実装していないか、実際に拡張していません Collection 名前が示すように、LINQ ベースの回答は役に立ちません。また、コレクションは数値インデックスを実装していますが、名前付きインデックスに主に依存しているため、コレクションを扱う最も直感的な方法ではありません。

役に立ちましたか?

解決

私はガイドラインに従っています:暗黙的な変換からスローするべきではありません。

この場合、暗黙的な変換は絶対に提供しません。明示的なキャストという考えさえ、私には間違っているように思えます。 Foo x = (Foo)fooCollection それは正しくないようです。

呼び出し元のコードに、からの変換を考慮させてみてはいかがでしょうか。 FooCollectionFoo?このコードは誰にとってもはるかに直感的です。

Foo a = fooCollection[0];
Foo b = fooCollection.First();
Foo c = fooCollection.FirstOrDefault();
// etc

他のヒント

これは明らかにOKではありません。 を決してロジックを実装するためのの使用の例外!

あなたはnullを与えるのLINQ文のFooCollection.FirstOrDefault()、または最初のアイテムを使用することができます。

キャストは、明示的でなければなりません。少なくとも、キャストせずにFooCollectionFooを割り当てることができるように非常に奇妙なことでしょう。

言われていること、私見キャストは、これを行うには良い方法ではありません。あなたはそれに何を言っている場合でも、あなたは、これらのクラスの実装を制御できない場合でも、あなたは少なくとも仕事を得るためにFoo ToFoo(this FooCollection collection)のような拡張メソッドを追加することができますので。

私は、関数を使用します
ちょうど1アイテムがコレクション内に存在する場合にのみ動作します。

暗黙のcopnversion?だから、実際には、それはほとんどの時間を動作しない?

私は、この変換が暗黙的にすることはありません。明示的に固執します。あなたの関数を使用して、プログラマは、単一のアイテムを持っているしたい場合は、彼は自分のクラスを教えてくださいます。

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