返回题库高级 .NET 刷题C# 选择题 · 第 5 / 50 篇

C# 试题 05:流程控制

0081 以下代码运行结果是什么?

难度: 进阶

int x = 42;
string s = x switch
{
    1 => "one",
    2 => "two",
};

Console.WriteLine(s);
  • A. 输出 one
  • B. 编译失败,switch 表达式必须穷尽
  • C. 编译通过但有警告,运行抛 SwitchExpressionException
  • D. 输出空字符串
查看答案与解析

正确答案C

解析:int 的 switch 表达式没有覆盖所有输入时,编译器只给出 CS8509 警告(不报错),运行时若无分支命中则抛 SwitchExpressionException

关键点: switch 表达式的穷尽性检查默认是警告,运行时兜底是异常。

0082 以下代码编译并运行,结果是什么?

难度: 进阶

enum Color { Red, Green, Blue }

Color c = Color.Green;
string s = c switch
{
    Color.Red => "R",
    Color.Green => "G",
    Color.Blue => "B",
};

Console.WriteLine(s);
  • A. 编译失败,枚举 switch 必须带默认分支
  • B. 编译无警告,输出 G
  • C. 编译警告,运行抛 SwitchExpressionException
  • D. 编译警告 CS8524(未穷尽),输出 G
查看答案与解析

正确答案D

解析: 枚举值可以来自未命名成员(如 (Color)99),因此即使覆盖全部命名成员,编译器仍判定不穷尽并给出 CS8524 警告;本例 Green 命中分支输出 G,若输入未命名枚举值则会抛 SwitchExpressionException

关键点: “覆盖所有命名成员”不等于“穷尽”,枚举 switch 常需 _ 兜底。

0083 以下代码输出什么?

难度: 实战

int count = 0;
for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 3; j++)
    {
        if (j == 1) continue;
        count++;
    }
}

Console.WriteLine(count);
  • A. 3
  • B. 6
  • C. 9
  • D. 编译失败
查看答案与解析

正确答案B

解析: continue 作用于最近的一层循环:内层 j 跳过 1 后每轮只累加 j = 0j = 2 两次,外层 3 轮共 6 次。

关键点: continue/break 只影响最近一层循环。

0084 以下代码输出什么?

难度: 实战

int i = 0;
while (i < 5)
{
    i++;
    if (i == 3) continue;
    Console.Write(i);
}
  • A. 12345
  • B. 123
  • C. 1234
  • D. 1245
查看答案与解析

正确答案D

解析: i 在循环体开头自增,i == 3continue 跳过打印,其余 1、2、4、5 正常输出。

关键点: continue 跳过的是本次迭代的剩余语句,循环条件与递增仍需自行维护。

0085 以下代码输出什么?

难度: 实战

static string M()
{
    try
    {
        return "R";
    }
    finally
    {
        Console.Write("F");
    }
}

Console.WriteLine(M());
  • A. FR
  • B. RF
  • C. R
  • D. F
查看答案与解析

正确答案A

解析: finallyreturn 表达式求值之后、方法真正返回之前执行:先打印 F,方法再返回 R,外层打印 R,整体输出 FR

关键点: return 先求值,finally 在真正返回前执行。

0086 以下代码能否编译?

难度: 进阶

static int M()
{
    try
    {
        return 1;
    }
    finally
    {
        return 2;
    }
}

Console.WriteLine(M());
  • A. 能编译,输出 1
  • B. 能编译,输出 2
  • C. 编译失败,控制流不能从 finally 块中离开(CS0157)
  • D. 能编译,运行抛异常
查看答案与解析

正确答案C

解析: 语言规范禁止 returnbreakcontinuegoto 等从 finally 块中转出控制流,编译报 CS0157;finally 只允许正常执行完或抛异常。

关键点:finallyreturn 是编译错误,不是“覆盖返回值”。

0087 以下代码输出什么?

难度: 进阶

var x = true ? 1 : 2.5;

Console.WriteLine(x.GetType().Name);
Console.WriteLine(x);
  • A. Int321
  • B. Double1
  • C. Double1.5
  • D. 编译失败
查看答案与解析

正确答案B

解析: 条件表达式要求两个分支存在隐式转换:int 可隐式转 double,结果类型为 double;条件为真取 1,转为 1.0,打印 Double1

关键点: 条件表达式的结果类型由两个分支按隐式转换规则收敛,而不是“取第一个分支的类型”。

0088 以下代码能否编译?

难度: 进阶

var x = true ? null : 42;

Console.WriteLine(x is null);
  • A. 能编译,输出 True
  • B. 能编译,输出 False
  • C. 编译失败,var 无法推断条件表达式类型,nullint 之间没有隐式转换(CS0173)
  • D. 能编译,输出 42
查看答案与解析

正确答案C

解析: 条件运算符要求两个分支互为隐式转换目标;null 字面量不会自动“变成” int?var 无从推断类型,报 CS0173。若目标类型明确(如 int? x = true ? null : 42;)则合法。

关键点:null 分支的条件表达式需要目标类型参与推断,不能只靠 var

0089 以下代码输出什么?

难度: 实战

int sum = 0;
for (int i = 1; i <= 3; i++)
{
    if (i == 2) goto end;
    sum += i;
}
end:
Console.WriteLine(sum);
  • A. 1
  • B. 0
  • C. 3
  • D. 6
查看答案与解析

正确答案A

解析: i == 2goto end 跳出循环,只累加了 i = 1sum 为 1;标签 end: 位于循环之后。

关键点: goto 的目标标签必须与 goto 位于同一函数体内。

0090 以下代码能否编译?

难度: 实战

goto label;
int x = 1;
label:
Console.WriteLine(x);
  • A. 能编译,输出 1
  • B. 编译失败,跳转绕过了 x 的初始化,x 可能未被赋值(CS0165)
  • C. 能编译,输出 0
  • D. 能编译,运行抛 NullReferenceException
查看答案与解析

正确答案B

解析: goto 向前跳转会绕过 int x = 1 的初始化,编译器按“可能未赋值”判定 x 的使用非法,报 CS0165。

关键点: goto 不能跳入会跳过局部变量初始化的作用域。

0091 以下代码输出什么?

难度: 进阶

static void M()
{
    try
    {
        throw new InvalidOperationException();
    }
    catch (Exception)
    {
        Console.Write("C");
        throw;
    }
    finally
    {
        Console.Write("F");
    }
}

try
{
    M();
}
catch (Exception)
{
    Console.Write("X");
}
  • A. CFX
  • B. CX
  • C. FCX
  • D. CF
查看答案与解析

正确答案A

解析: catch 打印 Cthrow 重抛,finally 在异常继续传播前打印 F,外层 catch 打印 X

关键点: 异常传播途中 finally 仍会执行,顺序是 catch → finally → 外层。

0092 以下代码输出什么?

难度: 实战

int count = 0;
foreach (var ch in "a b c")
{
    if (ch == ' ') continue;
    count++;
}

Console.WriteLine(count);
  • A. 5
  • B. 3
  • C. 4
  • D. 7
查看答案与解析

正确答案B

解析: 字符串 "a b c" 共 5 个字符,两个空格被 continue 跳过,非空字符 3 个。

关键点: foreachcontinue 同样跳过本次迭代剩余语句。

0093 以下代码输出什么?

难度: 实战

int score = 75;
string grade = score switch
{
    >= 90 => "A",
    >= 80 => "B",
    >= 60 => "C",
    _ => "D",
};

Console.WriteLine(grade);
  • A. D
  • B. B
  • C. C
  • D. A
查看答案与解析

正确答案C

解析: 关系模式按声明顺序自上而下匹配,75 不满足 >= 90>= 80,命中 >= 60 输出 C

关键点: switch 表达式按分支顺序取第一个匹配,关系模式区间要保证顺序。

0094 以下代码能否编译?

难度: 实战

static void M(int x)
{
    switch (x)
    {
        case 1:
            Console.Write("1");
        case 2:
            Console.Write("2");
            break;
    }
}

M(1);
  • A. 能编译,输出 12
  • B. 能编译,输出 1
  • C. 能编译,运行抛异常
  • D. 编译失败,非空 case 分支不能贯穿到下一个 case(CS0163)
查看答案与解析

正确答案D

解析: C# 的 switch 语句中,含语句的 case 分支末尾必须显式跳出(break/return/goto),不允许 C 风格的隐式贯穿,编译报 CS0163;只有空 case 可以堆叠。

关键点: “空 case 可堆叠、非空 case 必须跳出”是 C# 与 C 的关键差异。

0095 以下代码输出什么?

难度: 进阶

var x = true ? 1 : 2L;
Console.WriteLine(x.GetType().Name);
  • A. Int32
  • B. Int64
  • C. UInt64
  • D. 编译失败
查看答案与解析

正确答案B

解析: int 可隐式转换为 long,条件表达式结果类型为 longxInt64

关键点: 条件表达式做“公共类型”收敛时,优先选择能容纳两者的更宽类型。

0096 以下代码输出什么?

难度: 实战

int i = 0, sum = 0;
do
{
    i++;
    if (i % 2 == 0) continue;
    sum += i;
} while (i < 5);

Console.WriteLine(sum);
  • A. 9
  • B. 6
  • C. 15
  • D. 10
查看答案与解析

正确答案A

解析: i 依次为 1~5,偶数 2、4 被 continue 跳过,累加 1 + 3 + 5 = 9。

关键点: do 循环至少执行一次,continue 后仍会回到条件判断。

0097 以下代码输出什么?

难度: 实战

int n = 0;
string s = n switch
{
    >= 0 => "nonneg",
    < 0 => "neg",
};

Console.WriteLine(s);
  • A. nonneg
  • B. neg
  • C. 编译失败
  • D. 编译警告且运行抛异常
查看答案与解析

正确答案A

解析:int 而言 >= 0< 0 两个关系模式覆盖全部取值,编译器判定穷尽、无警告;0 命中第一个分支输出 nonneg

关键点: 关系模式组合能证明穷尽时,不需要 _ 兜底也不会有警告。

0098 关于 finallyreturn 的执行顺序,哪项正确?

难度: 进阶

  • A. finallyreturn 表达式求值之前执行
  • B. 只要控制流进入 try,无论正常返回还是抛异常,finally 都会在控制离开方法前执行;return 表达式的值先于 finally 计算
  • C. tryreturnfinally 不执行
  • D. catchreturnfinally 不执行
查看答案与解析

正确答案B

解析: finally 保证在控制流离开 try/catch 之前执行;return 先求值并暂存结果,finally 执行完方法才真正返回,catchreturn 同理。

关键点: “先求值、后执行 finally、再真正返回”是理解 finally 的顺序模型。

0099 关于 switch 表达式与 switch 语句的差异,哪项正确?

难度: 进阶

  • A. 两者都必须穷尽
  • B. switch 表达式必须穷尽,否则可能抛 SwitchExpressionException;switch 语句没有穷尽性要求
  • C. switch 表达式允许非空 case 贯穿
  • D. 两者等价
查看答案与解析

正确答案B

解析: switch 表达式是产生值的表达式,编译器要求穷尽(不穷尽给警告,运行时抛 SwitchExpressionException);switch 语句没有穷尽性约束,未命中任何 case 时直接跳过。

关键点: 表达式要“有值”,因此穷尽是硬约束;语句可以“什么都不做”。

0100 关于 goto 的合法目标,哪项正确?

难度: 实战

  • A. goto 可跨方法跳转
  • B. goto 可跳入 catch/finally 块内部
  • C. 标签必须先于 goto 声明
  • D. goto 只能在同一函数体内跳转,且不能跳入会绕过局部变量初始化的作用域
查看答案与解析

正确答案D

解析: 标签属于声明它的函数体,跨函数跳转非法;跳入 catch/finally、跳过局部变量初始化(CS0165)也都是编译错误;标签可以位于 goto 之后(向前跳)。

关键点: goto 的合法目标是“同函数内、不破坏初始化与异常处理边界”的标签。

官方资料

当前分类

C# 选择题

查看全部分类 →
  1. 03C# 试题 03:可空类型与空值分析20 题
  2. 04C# 试题 04:运算符与表达式20 题
  3. 05C# 试题 05:流程控制20 题
  4. 06C# 试题 06:方法与参数20 题
  5. 07C# 试题 07:类与构造函数20 题
ESC

输入关键词开始搜索