Re[3]: Паттерн "или"
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.04.23 03:26
Оценка: 523 (12)
Здравствуйте, VladD2, Вы писали:

TB>>Только какой тип у этого x внутри блока? B или C?


VD>Наиболее частный общий.


Он может быть неоднозначным, например, у них могут быть несколько общих интерфейсов, не связанных друг с другом. Или, например, у контравариантных делегатов Action<Array> и Action<IList<object>> есть общий базовый тип MulticastDelegate, но он не самый специфичный. Потому что у них ещё есть более узкие общие базовые типы Action<string[]>, Action<string[][]> (и много других), но ни один из них не является более специфичным чем другой, хотя они все более специфичны, чем MulticastDelegate.

А по поводу твоего исходного вопроса — это можно сделать так:
if (foo() is (B or C) and var x)
{
  // здесь x имеет тип A, но попадаем сюда, только если значение x имеет тип B или С (или более производный)
}

Или же можно написать так (это вопрос стиля):
if (foo() is var x and (B or C))
{
  // здесь x имеет тип A, но попадаем сюда, только если значение x имеет тип B или С (или более производный)
}


А если, например, foo() имеет тип object, а ты хочешь чтобы x имела тип A (общий для B и C), то (ввиду возможной неоднозначности указанной выше) надо указать, какой именно общий тип ты хочешь у переменной:
if (foo() is (B or C) and A x) 
{
  // здесь x имеет тип A, но попадаем сюда, только если значение x имеет тип B или С (или более производный)
}

или, как вариант,
if (foo() is A x and (B or C)) 
{
  // здесь x имеет тип A, но попадаем сюда, только если значение x имеет тип B или С (или более производный)
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.