【问题标题】:Optional Argument: compile time constant issue可选参数:编译时间常数问题
【发布时间】:2012-09-04 14:57:01
【问题描述】:

为什么会这样:

public int DoesEmailAddressExistsExcludingEmailAddressID(
    string emailAddress, 
    string invitationCode, 
    int emailAddressID = 0, 
    int For = (int) Enums.FOR.AC)

而这不是

public int DoesEmailAddressExistsExcludingEmailAddressID(
    string emailAddress, 
    string invitationCode, 
    int emailAddressID = 0, 
    int For = Enums.FOR.AC.GetHashCode())

其中 AC 是枚举。枚举的哈希码可以在运行时改变吗?

【问题讨论】:

  • GetHashCode() 需要执行代码。这意味着它不是编译时间常数。
  • 这个问题的解决方案,顺便说一下,是使用经典的 C# 重载方法,而不是使用默认参数。
  • 我强烈建议不要使用For 作为变量名。第一个示例as is 实际上不会编译。

标签: c# .net compiler-errors


【解决方案1】:

GetHashCode 是一种方法。方法的返回值不是编译时常量,因为需要执行代码来确定返回值。
方法返回是否始终相同并不重要。

【讨论】:

    【解决方案2】:

    Enum 的哈希码很有可能在程序运行时保持不变。但是,这在编译时并不能保证。因此它不能是编译时常量。

    此外,正如 Daniel 已经提到的,必须执行 GetHashCode 来确定值,这显然不能在编译时完成。

    【讨论】:

    • +1 表示一个好点:实际上我们知道几乎可以肯定枚举的哈希码总是相同的,但是不能保证,所以编译器有像对待任何其他方法调用一样对待方法调用。
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多