是否可以在switch语句中使用nameof表达式?

Rog*_*ier 9 .net c# roslyn nameof

新的C#6.0nameof在使用PropertyChanged以下内容传播属性更改的模式中非常出色:

private string _myProperty;

public string MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        _myProperty= value;
        OnPropertyChanged(nameof(MyProperty));
    }
}
Run Code Online (Sandbox Code Playgroud)

在监听属性更改时,我使用它(是的,即使是丑陋的硬编码字符串):

    private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        switch (args.PropertyName)
        {
            case "MyProperty":
                DoSomething();
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用新的nameof表达式,这段代码会编译/工作吗?

private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case nameof(MyObject.MyProperty):
            DoSomething();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 15

根据这个问题,nameof关键字的评估是在编译时完成的.这将使它成为一个常量,它将在switch语句中起作用.

当您查看此代码的已编译输出时,可以证明这一点:

using System;

public class Program
{
    public string A { get; set; }

    public static void Main()
    {
        string a = "A";

        switch (a)
        {
            case nameof(Program.A):
            {
                Console.WriteLine("Yes!");
                break;
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

是!