De MSDN:¿Alguna vez hay una excusa para lanzar una excepción de una conversión implícita?
Mediante la eliminación de moldes innecesarias, las conversiones implícitas pueden mejorar la legibilidad del código fuente. Sin embargo, dado que las conversiones implícitas pueden ocurrir sin que el programador las especifique, se debe tener cuidado para evitar sorpresas desagradables. En general, los operadores de conversión implícitos nunca deben arrojar excepciones y nunca perder información para que puedan ser utilizados de manera segura sin la conciencia del programador. Si un operador de conversión no puede cumplir esos criterios, debe marcarse explícitamente.
Si bien no estoy en desacuerdo con cualquier punto particular, y estoy de acuerdo que todo esto es muy bueno, es que alguna vez una razón que es lo suficientemente grande como para justificar romper la parte de las conversiones implícitas no lanzar excepciones?
El caso particular tengo ante mí es uno donde:
- Tengo una función que devuelve un objeto de colección personalizada (lo llamaremos
FooCollection
). - Esta función puede devolver colecciones con un solo elemento, y se puede determinar desde el código fuente si esto sucederá o no. (Con esto me refiero solo a la llamada de función, no a la función en sí)
- Si esto sucede, es 99.9% probable que el usuario quiera ese elemento individual, en lugar de una colección con un solo artículo.
ahora, estoy tirando hacia arriba si se debe incluir una conversión implícita de FooCollection
=>Foo
para ocultar este pequeño detalle de implementación, pero esta conversión sólo funcionará si hay un solo elemento de la colección.
¿Está bien arrojar un Exception
en este caso? ¿O debería usar un yeso explícito en su lugar? ¿Alguna otra idea sobre cómo podría lidiar con esto (no, debido a los detalles de implementación, no puedo usar solo dos funciones)?
EDIT: me siento digno de notar que FooCollection
no implementa las interfaces o en realidad se extienden Collection
como su nombre podría dar a entender, por lo tanto, las respuestas basadas LINQ son inútiles. Además, si bien la colección implementa un índice numérico, no es la forma más intuitiva de tratar con la colección, ya que depende principalmente del índice nombrado.
'Foo x = (Foo) fooCollection' tampoco sería" correcto "(aunque se compilaría). 'Foo x = (Foo) fooCollection.x()' sería la forma en que se usaría. –
x() es una función que devuelve un subconjunto de 1 elemento de fooCollection. –
También vea mi edición en la pregunta. –