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);
}
Вот несколько изображений, на которых нет волнистых участков, и они действительно хорошо выглядят:
Наконец, обратите внимание, что я запустил тест со статической строкой, а не с использованием файла ресурсов, и он прошел. Я просто упустил материал файла ресурсов для простоты в приведенном выше коде.
Любые мысли по этому поводу очень ценятся! Заранее спасибо!
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
,