MSDNから:暗黙の変換から例外をスローする理由はありますか?
不要なキャストを排除することによって、暗黙的な変換は、ソースコードの可読性を向上させることができます。しかし、プログラマが指定しなくても暗黙の変換が発生する可能性があるため、不愉快な驚きを防ぐために注意が必要です。一般に、暗黙の変換演算子は、例外をスローして情報を失うことはありません。そのため、プログラマーの認識なしに安全に使用できるようになります。変換演算子がこれらの条件を満たすことができない場合は、明示的にマークする必要があります。
私は特定の点に同意していませんが、これはすべて非常に良いことに同意しますが、暗黙的な変換について例外をスローしないことを保証するのに十分な理由はありますか?
私は1である前に私が持っている特別な場合:私は、カスタムコレクションオブジェクトを返す関数を、持っている
- (我々はそれ
FooCollection
を呼ぶことにします)。 - この関数は単一項目のコレクションを返すことができ、はソースコードからこれが起きるかどうかを判断することができます。 (これは私が関数呼び出しではなく、関数自体を意味する)
- もし起これば、単一のアイテムを持つコレクションではなく、その単一のアイテムがほしいと思う可能性が99.9%です。
今、私はこの小さな実装の詳細を隠すためにFooCollection
=>Foo
からの暗黙的な変換を含めるかどうかまで投げんだけど、単一の項目がコレクション内に存在する場合、この変換はのみ動作します。
この場合、Exception
を送信してもよろしいですか?代わりに明示的なキャストを使用する必要がありますか?どのように私はこれに対処することができるかについての他のアイデア(実装の詳細のために、私は単に2つの機能を使用することはできません)?
EDIT:私はFooCollection
が故にLINQベースの答えは役に立たない、暗示する可能性のあるインタフェースを実装したり、実際に名前としてCollection
を延長しないことを指摘することは価値がある感じ。また、コレクションは数値インデックスを実装していますが、主に名前付きインデックスに依存するため、コレクションを扱う最も直感的な方法ではありません。
'Foo x =(Foo)fooCollection'はどちらも '正しい'とは言えません(コンパイルされますが)。 'Foo x =(Foo)fooCollection.x()'はそれが使用される方法になります。 –
x()は、fooCollectionから1つの項目のサブセットを返す関数です。 –
質問に私の編集を見てください。 –