Подтвердить что ты не робот

Недействительный синтаксис синтаксиса вызывается успешно?

Может кто-нибудь, пожалуйста, помогите просветить меня?

Я пошел на регистрацию некоторых изменений в TFS, и моя регистрация была отклонена. Это побудило меня взглянуть на выражение о переключении, которое я редактировал.

Что я нашел, так это то, что Visual Studio 2017 утверждает, что нет проблемы с компиляцией и позволяет мне успешно создавать и развертывать приложение. Кроме того, даже unit test для метода, по-видимому, проходит, как предполагалось.

public enum PaymentStatus
{
    Issued,
    Cleared,
    Voided,
    Paid,
    Requested,
    Stopped,
    Unknown
}

public class PaymentViewModel
{
    public PaymentStatus Status { get; set; }

    ...

    public String StatusString
    {
        get
        {
            switch (this.Status)
            {
                case PaymentStatus.Cleared:
                    return "Cleared";
                case PaymentStatus.Issued:
                    return "Issued";
                case PaymentStatus.Voided:
                    return "Voided";
                case PaymentStatus.Paid:
                    return "Paid";
                case PaymentStatus.Requested:
                    return "Requested";
                case PaymentStatus.Stopped:
                    return "Stopped";
                case PaymentStatus Unknown:
                    return "Unknown";
                default:
                    throw new InavlidEnumerationException(this.Status);
            }
        }
    }
}

Итак, обратите внимание, что в строке "case PaymentStatus Unknown" отсутствует символ ".". точечный оператор. Как уже упоминалось, проект строится и запускается; но не удалось выполнить регистрацию с закрытым сервером сборки.

Также обратите внимание, что следующий тест проходит:

[TestMethod]
public void StatusStringTest_Unknown()
{
    var model = new PaymentViewModel()
    {
        Status = PaymentStatus.Unknown
    }

    Assert.AreEqual("Unknown", model.StatusString);
}

Вот некоторые изображения, не показывающие squigglies, и они действительно строят отлично: Ошибка компилятора-компилятора

И, проходящий тестовый метод: Switch-Passing-Test

Наконец, обратите внимание, что я запускал тест только с помощью статической строки, а не с помощью файла ресурсов, и он проходит. Я просто оставил материал файла ресурсов для простоты в коде выше.

Любые мысли об этом наиболее ценятся! Спасибо в Advance!

4b9b3361

Ответ 1

Это компилируется, потому что ваша Visual Studio интерпретирует PaymentStatus Unknown как сопоставление шаблонов, которая представляет собой новую функцию в С# 7:

  • PaymentStatus - тип,
  • Unknown - это имя,
  • Никакое условие (т.е. шаблон всегда совпадает).

Предполагаемый прецедент для этого синтаксиса был примерно таким:

switch (this.Status) {
    case PaymentStatus ended when ended==PaymentStatus.Stopped || ended==PaymentStatus.Voided:
        return "No payment for you!";
    default:
        return "You got lucky this time!";
}

Если TFS настроен на использование более старой версии С#, он отклонит этот источник.

Примечание. Причина, по которой работает ваш unit test, состоит в том, что все остальные дела выполнены правильно. Однако тестовый сценарий для метания InavlidEnumerationException(this.Status) потерпел бы неудачу, потому что коммутатор интерпретировал любое неизвестное значение как, ну, PaymentStatus.Unknown.