"if (object is (string, Color))" С# 7.0 кортеж не работает
Я использую Visual Studio 2017 RC, и я установил пакет System.ValueTuple
, который позволяет использовать новый кортеж С# 7.0, но я не могу заставить его работать в этом конкретном случае:
![]()
Как вы можете видеть, первый метод не имеет красных squigglies, и он просто работает. Но попытка выполнить o is (string, Color)
не выполняется с несвязанными ошибками:
![]()
Можно ли использовать новые кортежи таким образом? Или это просто текущее состояние пакета? Я обновил его до последней версии btw, которая в настоящее время составляет 4.3.0. Я прочитал этот пост MSDN, но не нашел такого использования.
Ответы
Ответ 1
Roslyn содержит тесты, которые обеспечивают использование кортежей при сопоставлении с образцом, вызывает ошибки (добавлено в этот PR, который ничего не объясняет), поэтому, похоже, в настоящее время это ожидаемое поведение. Я не уверен, в чем причина этого, или если окончательная версия С# 7.0 будет вести себя так. Это, безусловно, то, что я ожидал бы работать.
Ответ 2
Некоторые функции сопоставления шаблонов были удалены из выпуска С# 7. Это включает сопоставление образцов для кортежей. Это вытаскивается и вкладывается в будущие отрасли. (https://github.com/dotnet/roslyn/issues/10866)
Это означает, что более сложные типы сопоставления шаблонов, эффективно объясняемые reddit poster wreckedadvent, не будут доступны на С# 7, включая:
- рекурсивные формы шаблонов, такие как позиционные шаблоны (например, p - Person ( "Микки", *), шаблоны свойств (например, p - Person {FirstName - "Микки" }), шаблоны кортежей, подстановочный знак * и т.д.
Источник: https://www.infoq.com/news/2016/05/csharp7-pattern-matching-removed
ОБНОВЛЕНИЕ: Тест типа (int, int)
можно интерпретировать как шаблон кортежа. Например, если вы хотите выполнить тест типа и привязать результат к переменной. Таким образом, тестирование типов связано с шаблонами кортежей. Например, (int x, int y)
может быть типом или шаблоном кортежа. См. Обсуждение сопоставления шаблонов в github: https://github.com/dotnet/roslyn/issues/11744