Я получаю ошибку Feature 'pattern matching' is not available in C# 4
в своем коде C#.
Я использую большой оператор переключения с несколькими случаями.
switch (Name)
{
case string a when a.Contains("Some string" + num):
Temp = MiddleName;
break;
// ... other cases
}
Я понимаю, что сопоставление шаблонов появилось в C# 7.
Есть ли способ добиться аналогичной функциональности в C# 4?.
Это огромный проект, у меня нет возможности обновить его.
... почему вы получаете ошибки о C# 4.0? Сейчас мы используем C# 12 (для .NET 8) или C# 7.3 для .NET Framework 4.8.1 или более ранней версии (действительно, вы даже можете использовать C# 7.3 для целевой .NET Framework 2.0, если знаете, что делаете). . Единственное место, где я ожидал увидеть csc.exe
только на C#, — это совершенно новая установка Windows 8...
Помимо многих недавних функций, которые отлично работают на старых платформах, если вы действительно используете версию платформы, которая естественным образом поддерживает только C# 4, это будет означать, что вы используете версию, поддержка которой больше не поддерживается. Я очень настоятельно рекомендую вам выполнить обновление — если вы обновитесь до новой версии .NET Framework (например, 4.8), она, скорее всего, в любом случае «просто будет работать». Чем дольше вы откладываете это, тем хуже для вас это будет - и тем больше вероятность, что вы столкнетесь с проблемой безопасности в неподдерживаемой версии.
«Это огромный проект, у меня нет возможности его модернизировать». Если это огромный проект, то ваша команда обязана регулярно вносить обновления в дорожную карту и просто выполнять их. Я считаю сильно устаревшие проекты а) сломанными и б) угрозой безопасности.
Просто добавьте <LangVersion>latest</LangVersion>
в группу свойств вашего .csproj. Тогда вы сможете использовать множество новейших функций языка (включая сопоставление с образцом) даже с очень старой версией платформы.
Вы всегда можете использовать старое доброе утверждение if-else
:
if (Name is string && ((string)Name).Contains("Some string" + num))
{
Temp = MiddleName;
}
else if (...) // some condition for another case
{
}
// ... other cases
else // default case
{
}
Спасибо, что приняли мой ответ @Randalrand. На всякий случай, если вы не знали, вы также можете проголосовать за любой полезный ответ (включая принятый), поскольку голосование и принятие различны. См.: Что мне делать, если кто-то отвечает на мой вопрос?.
Вы можете написать где-нибудь еще свою современную эргономичную логику сопоставления с образцом - скомпилировать, а затем использовать ILSpy или какой-либо другой декомпилятор, чтобы указать версию C# (т. е. 4) и использовать этот код в своем приложении (которое, очевидно, требует обновления).
Этот пример из документации:
void DisplayMeasurements(int a, int b)
{
switch ((a, b))
{
case (> 0, > 0) when a == b:
Console.WriteLine($"Both measurements are valid and equal to {a}.");
break;
case (> 0, > 0):
Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
break;
default:
Console.WriteLine("One or both measurements are not valid.");
break;
}
}
переводится на C#4:
private void DisplayMeasurements(int a, int b)
{
if (a > 0 && b > 0)
{
if (a == b)
{
Console.WriteLine(string.Format("Both measurements are valid and equal to {0}.", a));
}
else
{
Console.WriteLine(string.Format("First measurement is {0}, second measurement is {1}.", a, b));
}
}
else
{
Console.WriteLine("One or both measurements are not valid.");
}
}
(Я знаю, что это не ваш код и он предназначен просто для демонстрации сути), но этот код был бы значительно проще, если бы они использовали беззнаковые типы.
@Dai, это просто официальный фрагмент кода, который я смог найти, возможно, я отредактирую его позже (или приму ваше редактирование :))
используйте операторы if else