Да, они могут быть вложенными.
#define A
#define B
void Main()
{
#if A
#if B
Console.WriteLine("A and B");
#else
Console.WriteLine("A and not B");
#endif
#else
#if B
Console.WriteLine("B and not A");
#else
Console.WriteLine("neither A nor B");
#endif
#endif
}
Выходы:
A and B
Вот вам .NET Fiddle , чтобы вы могли попробовать.
Вы можете закомментировать две строки вверху отдельно, чтобы получить разные результаты, например:
#define A
// #define B
Выходы:
A and not B
Вот тот же код с отступом, которыйделает это более понятным, хотя я бы не делал отступ в таком коде.Чрезмерное использование таких условных директив, на мой взгляд, является запахом кода.
#define A
// #define B
void Main()
{
#if A
#if B
Console.WriteLine("A and B");
#else
Console.WriteLine("A and not B");
#endif
#else
#if B
Console.WriteLine("B and not A");
#else
Console.WriteLine("neither A nor B");
#endif
#endif
}