8

MSDNから:

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

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

私の前にある特定のケースは、次の場合です。

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

FooCollectionここで、 =>からの暗黙的な変換を含めて、Fooこの小さな実装の詳細を隠すかどうかを検討していますが、この変換は、コレクションに単一のアイテムがある場合にのみ機能します。

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

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

4

4 に答える 4

11

私はガイドラインに賛成です。暗黙の変換からスローするべきではありません。

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

FooCollection呼び出し元のコードに からへの変換を心配させてみませんFooか? コードは誰にとってもはるかに直感的です。

Foo a = fooCollection[0];
Foo b = fooCollection.First();
Foo c = fooCollection.FirstOrDefault();
// etc
于 2009-10-08T12:03:59.433 に答える
1

それは明らかにOKではありません。ロジックを実装するために例外を使用しないでください。

FooCollection.FirstOrDefault()null または最初の項目を与えるLinq-Statement を使用できます。

于 2009-10-08T12:04:07.873 に答える
0

キャストは明示的である必要があります。少なくともキャストなしでaFooCollectionに aを代入できるのは非常に奇妙です。Foo

そうは言っても、IMHO キャストはこれを行うには良い方法ではありません。あなたがそれにノーと言ったとしても、関数を使用します。なぜなら、これらのクラスの実装を制御できなくても、少なくとも拡張メソッドを追加Foo ToFoo(this FooCollection collection)して仕事を終わらせることができるからです。

于 2009-10-08T12:00:58.613 に答える
0

コレクションにアイテムが 1 つしかない場合にのみ機能する暗黙的なコピーバージョン? では、実際には、ほとんどの場合は機能しませんか?

この変換を暗黙的にすることは決してありません。明示的に固執します。関数を使用するプログラマーが単一のアイテムを持ちたい場合は、クラスに伝える必要があります。

于 2009-10-08T12:04:03.860 に答える