Здравствуйте, 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 или С (или более производный)
}