2009-10-08 5 views
6

MSDNから:暗黙の変換から例外をスローする理由はありますか?

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

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

私は1である前に私が持っている特別な場合:私は、カスタムコレクションオブジェクトを返す関数を、持っている

  1. (我々はそれFooCollectionを呼ぶことにします)。
  2. この関数は単一項目のコレクションを返すことができ、はソースコードからこれが起きるかどうかを判断することができます。 (これは私が関数呼び出しではなく、関数自体を意味する)
  3. もし起これば、単一のアイテムを持つコレクションではなく、その単一のアイテムがほしいと思う可能性が99.9%です。

今、私はこの小さな実装の詳細を隠すためにFooCollection =>Fooからの暗黙的な変換を含めるかどうかまで投げんだけど、単一の項目がコレクション内に存在する場合、この変換はのみ動作します。

この場合、Exceptionを送信してもよろしいですか?代わりに明示的なキャストを使用する必要がありますか?どのように私はこれに対処することができるかについての他のアイデア(実装の詳細のために、私は単に2つの機能を使用することはできません)?

EDIT:私はFooCollectionが故にLINQベースの答えは役に立たない、暗示する可能性のあるインタフェースを実装したり、実際に名前としてCollectionを延長しないことを指摘することは価値がある感じ。また、コレクションは数値インデックスを実装していますが、主に名前付きインデックスに依存するため、コレクションを扱う最も直感的な方法ではありません。

答えて

10

私はガイドラインを守っています:暗黙の変換を捨てるべきではありません。

私は間違いなくこの場合暗黙の変換を行いません。明示的なキャストという考えでさえ私には間違っていると感じます。Foo x = (Foo)fooCollectionはちょうど正しいようには見えません。

FooCollectionからFooへの変換について、呼び出し側のコードが心配するのはなぜですか?ちょうど1アイテムがコレクション内に存在する場合にのみ動作し、暗黙のcopnversion

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

'Foo x =(Foo)fooCollection'はどちらも '正しい'とは言えません(コンパイルされますが)。 'Foo x =(Foo)fooCollection.x()'はそれが使用される方法になります。 –

+0

x()は、fooCollectionから1つの項目のサブセットを返す関数です。 –

+0

質問に私の編集を見てください。 –

0

キャストは明示的にする必要があります。少なくともキャストなしでをFooに割り当てることは非常に奇妙です。

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

+0

これはC#4.0のコンテキストと動的タイプ –

+0

であるため、実際には50%は動作しません。私は動的ルーティングがアカウントの拡張方法をとるかどうかはわかりません。ダング、今私は私が試してみたい何かがある! –

0

:コードは、はるかに直感的に皆のためでしょうか?だから、実際には、ほとんどの時間は動かないのですか?

私は決してこの変換を暗にしません。明白に固執する。あなたの関数を使用しているプログラマーが単一の項目を持っていたい場合、彼はあなたのクラスに伝えるべきです。

1

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

nullまたは最初の項目を指定するLinq-Statement FooCollection.FirstOrDefault()を使用することができます。

関連する問題