gpt4 book ai didi

c# - 有没有借口从隐式转换中抛出异常?

转载 作者:太空狗 更新时间:2023-10-29 21:11:22 27 4
gpt4 key购买 nike

来自 MSDN :

By eliminating unnecessary casts, implicit conversions can improve source code readability. However, because implicit conversions can occur without the programmer's specifying them, care must be taken to prevent unpleasant surprises. In general, implicit conversion operators should never throw exceptions and never lose information so that they can be used safely without the programmer's awareness. If a conversion operator cannot meet those criteria, it should be marked explicit.

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

我遇到的特殊情况是:

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

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

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

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

最佳答案

我的准则是:你不应该从隐式转换中抛出。

在这种情况下我绝对不会提供隐式转换。即使是显式转换的想法对我来说也是错误的:Foo x = (Foo)fooCollection 似乎不对。

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

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

关于c# - 有没有借口从隐式转换中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com