为什么 Enum.ToString 不可接受作为属性参数字符串类型的 const 字符串?

You*_*jae 3 c# string enums constants

[TL;DR]const string SomeConstString = SomeEnum.OneEnumValue.ToString();即使可以在编译时处理,为什么在 C# 中不允许?

以下属性定义来自Azure WebJobs SDK

[AttributeUsage(AttributeTargets.Parameter)]
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public sealed class ServiceBusTriggerAttribute : Attribute
{
    private readonly string _queueName;
    private readonly string _topicName;
    private readonly string _subscriptionName;

    /// <summary>
    /// Initializes a new instance of the <see cref="ServiceBusTriggerAttribute"/> class.
    /// </summary>
    /// <param name="queueName">The name of the queue to which to bind.</param>
    public ServiceBusTriggerAttribute(string queueName)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

代码的用法如下;

public static void GetBapulActivityFromTopic(
        [ServiceBusTrigger("SomeConstString")] BrokeredMessage message,
        TextWriter log)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

在上面的用法中,我理解"SomeConstString"应该是const string类型,因为值必须是编译时常量。

但为什么SomeEnum.OneEnumValue.ToString()不能是编译时常量呢?

das*_*ght 5

尽管SomeEnum.OneEnumValueconst,但根据 C# 语言规范,对其调用方法并不是编译时常量表达式。以下是允许的部分列表:

  • 文字(包括null文字)。
  • const对类和结构类型成员的引用。
  • 对枚举类型成员的引用。
  • const对参数或局部变量的引用
  • 带括号的子表达式,它们本身就是常量表达式。

常量表达式中不允许方法调用。完整列表请参见第 N.19 节。

如果您使用的是 C# 6,则可以使用nameof运算符来代替,它会生成一个编译时常量:

const string SomeConstString = nameof(SomeEnum.OneEnumValue);
Run Code Online (Sandbox Code Playgroud)