8

来自MSDN

通过消除不必要的强制转换,隐式转换可以提高源代码的可读性。然而,因为隐式转换可以在没有程序员指定的情况下发生,所以必须注意防止令人不快的意外。一般来说,隐式转换运算符不应该抛出异常,也不应该丢失信息,以便在程序员不知情的情况下安全地使用它们。如果转换运算符不能满足这些条件,则应将其标记为显式。

虽然我不反对任何特定的观点,并且我同意这一切都非常好,但是否有足够的理由来保证打破关于隐式转换不引发异常的部分?

我面前的特殊情况是:

  1. 我有一个函数,它返回一个自定义集合对象(我们称之为FooCollection)。
  2. 该函数可以返回单个项目的集合,并且可以从源代码中确定是否会发生这种情况。(我的意思是函数调用,而不是函数本身)
  3. 如果确实发生了,那么用户有 99.9% 的可能性想要该单个项目,而不是包含单个项目的集合。

现在,我正在考虑是否包含来自FooCollection=>的隐式转换Foo以隐藏这个小的实现细节,但这种转换只有在集合中有单个项目时才有效。

Exception在这种情况下可以抛出一个吗?或者我应该使用显式强制转换吗?关于如何处理这个问题的任何其他想法(不,由于实现细节我不能只使用两个函数)?

编辑:我觉得值得注意的是FooCollection它没有实现任何接口或实际上扩展Collection名称可能暗示,因此基于 LINQ 的答案是无用的。此外,虽然集合确实实现了数字索引,但它并不是处理集合的最直观方式,因为它主要依赖于命名索引。

4

4 回答 4

11

我同意指导方针:你永远不应该从隐式转换中抛出。

在这种情况下,我绝对不会提供隐式转换。即使是明确演员的想法对我来说也是错误的:Foo x = (Foo)fooCollection只是看起来不对。

为什么不让调用代码担心从FooCollectionto的转换Foo?代码对每个人来说都会更直观:

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

显然不行。永远不要使用异常来实现逻辑!

您可以使用 Linq-Statement FooCollection.FirstOrDefault(),它将给出 null 或第一项。

于 2009-10-08T12:04:07.873 回答
0

演员表应该是明确的。能够在没有演员阵容的情况下将 a 分配给FooCollectiona会很奇怪。Foo

话虽这么说,恕我直言,演员并不是这样做的好方法。即使你拒绝它,我也会使用一个函数,因为即使你无法控制这些类的实现,你至少可以添加扩展方法Foo ToFoo(this FooCollection collection)来完成工作。

于 2009-10-08T12:00:58.613 回答
0

仅当集合中只有 1 个项目时才起作用的隐式 copnversion?所以,事实上,它大部分时间都不起作用?

我永远不会隐含这种转换。坚持显式。如果使用您的函数的程序员想要拥有单个项目,他应该只告诉您的班级。

于 2009-10-08T12:04:03.860 回答