Можно ли использовать выражение nameof в операторе switch?

Новый C# 6.0 nameof отлично подходит для шаблона 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 "MyProperty":
                DoSomething();
                break;
        }
    }

Будет ли этот код компилироваться/работать с новым именем выражений?

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

person Rogier    schedule 07.05.2015    source источник
comment
Я не думаю, что nameof(MyObject.MyProperty) сработает. MyProperty не статично. Вам понадобится экземпляр MyObject.   -  person Frédéric Hamidi    schedule 07.05.2015
comment
Это. Имя свойства всегда статично @FrédéricHamidi   -  person Patrick Hofman    schedule 07.05.2015


Ответы (1)


Согласно этому вопросу, оценка ключевого слова 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;
            }
        }

    }
}

Выход:

Да!

person Patrick Hofman    schedule 07.05.2015
comment
Это еще не ответ на вопрос, работает ли он также с нестатическими членами и, что более важно, со свойствами. Синтаксис для идентификации таких методов, как Program.Main, уже существовал, например, для идентификации метода, передаваемого обработчикам событий. Однако возможно ли что-то вроде Program.SomeProperty? (Основываясь на небольшом расширении вашего Fiddle, кажется, что это так, но я думаю, что его следует добавить, поскольку свойства - это то, о чем просили.) - person O. R. Mapper; 07.05.2015
comment
Я стал осторожнее с курсами; сигнатура конкретной перегрузки метода также является константой, и тем не менее для ее выражения не существует синтаксиса C#, что является основной причиной, по которой мы просто получаем nameof вместо оператора infoof. - person O. R. Mapper; 07.05.2015
comment
Спасибо за ответ! - person Rogier; 07.05.2015
comment
@O.R.Mapper Если вы не верите Патрику, вы можете перепроверить nameof здесь: tryroslyn.azurewebsites.net - person JoshVarty; 07.05.2015
comment
@JoshVarty: Как я уже писал в своем комментарии, я уже проверил утверждение 8 часов назад. Однако было важно, чтобы этот ответ действительно показал, что nameof можно использовать для свойств так, как спрашивал OP, а не просто показывал, что его можно использовать для методов, и делал вывод, что это, безусловно, возможно для свойств, потому что имена свойств постоянны. Многие элементы кода являются постоянными, но только некоторые из них могут быть идентифицированы в допустимом коде C#. - person O. R. Mapper; 07.05.2015
comment
@ORMapper, как показывает этот ответ, работает. И имена свойств являются константами. - person Patrick Hofman; 07.05.2015
comment
@PatrickHofman: Да, поскольку свойства были включены в ответ, это показывает, что :) И да, конечно, имена свойств являются константами, я никогда не утверждал ничего другого - просто ответ на вопрос нельзя сделать из факта что имена свойств являются константами. - person O. R. Mapper; 07.05.2015
comment
@O.R.Mapper хорошо. Понятно. - person Patrick Hofman; 07.05.2015