C# 可以在switch语句中使用nameof表达式吗?

C# 可以在switch语句中使用nameof表达式吗?,c#,.net,roslyn,nameof,C#,.net,Roslyn,Nameof,在PropertyChanged模式中,新功能非常适用于使用以下内容传播属性更改: private string _myProperty; public string MyProperty { get { return _myProperty; } set { _myProperty= value; OnPropertyChanged(nameof(MyProperty)); } } 在侦听属性更

PropertyChanged
模式中,新功能非常适用于使用以下内容传播属性更改:

private string _myProperty;

public string MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        _myProperty= value;
        OnPropertyChanged(nameof(MyProperty));
    }
}
在侦听属性更改时,我使用此选项(是的,即使使用难看的硬编码字符串):

使用新的表达式名称,这段代码可以编译/工作吗

private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case nameof(MyObject.MyProperty):
            DoSomething();
            break;
    }
}
根据,对
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;
            }
        }

    }
}
输出:

对!


我认为
nameof(MyObject.MyProperty)
不起作用<代码>我的属性不是静态的。您需要一个
MyObject
的实例。它是。属性名始终是静态的@Frédérichamiditis还不能回答它是否也适用于非静态成员,也许更重要的是,属性。例如,用于标识传递给事件处理程序的方法的语法(如
Program.Main
)已经存在。但是,类似于
Program.SomeProperty
的东西也可能吗?(根据你的小提琴的一点延伸,似乎是这样,但我认为应该加上它,因为它要求的是属性。)我对“当然”变得很谨慎;一个特定方法重载的签名也是一个常量,但是没有C#语法来表达它。谢谢你的回答@O.R.Mapper如果你不相信Patrick,你可以在这里再次检查
nameof
:@O.R.Mapper好的。知道了。
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;
            }
        }

    }
}