【问题标题】:Enum.TryParse: Is there a guarantee or contract for the out parameter value when the return value is `false`?Enum.TryParse:当返回值为`false`时,out参数值是否有保证或约定?
【发布时间】:2012-09-03 16:10:22
【问题描述】:

根据the documentation for Int32.TryParse,如果该方法返回false,它会将out参数设置为零。我在its documentation 中没有看到 Enum.TryParse 的类似保证。似乎应该有这样的保证,因为方法必须将out参数设置为something,而零最有意义。

是否在其他地方指定或记录了保证,或者真的没有保证?

【问题讨论】:

  • 为什么不试试呢?但我猜它可能只是空出来的
  • 正如您所指出的,该方法必须将 out 参数设置为 something。我想这就是你的答案;您可以保证将 out 参数设置为 something.
  • @PhillipSchmidt 我试过了,结果为零——它不能为空,因为它是一个不可为空的值类型。我想知道是否有保证,因为如果没有,我应该假设行为可能会在框架的未来版本中发生变化。
  • 如果解析不起作用,为什么还要依赖该值?如果您对这种情况感兴趣,也许您可​​以在解析失败后自己将其设置为零。或者,您可以创建一个返回option type 的方法,以便在解析不起作用时强制客户端使用结果。
  • 这似乎是你不应该依赖的一个很好的例子,即使它在某处得到保证,只是在代码可读性/可维护性方面。可能不清楚您的代码是否依赖此实现。

标签: c# .net enums tryparse base-class-library


【解决方案1】:

我不希望它被保证是比“某物”更具体的东西。由于文档没有另外说明(并且它是唯一的官方文档),所以只使用返回值,但如果返回为 false,则忽略 out 参数。

旁注:我认为 Int32.TryParse 指定在解析失败时设置的 out 参数是错误的,因为人们应该自行决定在每种特定情况下“不是真正的数字”意味着什么......但这是我的个人意见。

【讨论】:

  • +1 我倾向于同意你的观点,如果我正在编写提示这个问题的代码,我什至不会问。该代码位于我不直接处理的代码库的一部分中;它使用 out 参数的值而不检查方法的返回值。我正在争论是否值得努力让我的老板注意到它以获得更改它的许可。如果false 返回的行为得到保证,则不更改它会更有防御性。
【解决方案2】:

根据MSDN

如果 value 是一个不对应的命名常量的名称 TEnum,该方法返回false。如果 value 是字符串表示 不代表 TEnum 基础值的整数 枚举,该方法返回一个枚举成员,其底层 value 是转换为整数类型的值。如果这种行为是 不可取,调用 IsDefined 方法以确保特定 整数的字符串表示实际上是 TEnum 的成员。

所以我绝对不会依赖 out 的值,以防电话返回 false

【讨论】:

  • +1 我同意你的看法。提示这个问题的代码没有检查方法的返回;它只是使用 out 参数变量,我正在争论是否要向我的老板提出这个问题。如果解析的值在失败时保证为零,我可以看到这将如何影响我们的调用方法,也许不必费心创建更改请求等。
猜你喜欢
  • 2011-12-02
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多