Invalid Switch синтаксис строится успешно?

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

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

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

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" отсутствует символ "." точка оператора. Как уже упоминалось, проект строится и работает; но не удалось зарегистрироваться на сервере gated build.

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

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

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

Вот несколько изображений, на которых нет волнистых участков, и они действительно хорошо выглядят: Переключатель-No-Compiler-Error

И, способ прохождения теста: Переключатель-Passing-Test

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

Любые мысли по этому поводу очень ценятся! Заранее спасибо!

1 ответ

Решение

Это компилируется, потому что ваша Visual Studio интерпретирует PaymentStatus Unknown как сопоставление с образцом, что является новой функцией C# 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 настроен на использование более старой версии C#, он отклонит этот источник.

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

Другие вопросы по тегам