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

C# 试题 13:枚举与元组

0241 以下代码输出什么?

难度: 实战

enum Color { Red, Green, Blue }

Color c = (Color)99;

Console.WriteLine(c);
  • A. 抛 InvalidCastException
  • B. 输出 99,枚举可保存底层类型范围内任意数值,未声明的值按数值输出
  • C. 输出 Red
  • D. 输出空行
查看答案与解析

正确答案B

解析: 枚举的运行时表示就是底层整数;(Color)99 合法,只是没有对应名称,ToString 退化为数字。

关键点: 枚举不是“成员集合”,是“带名字的整数”。

0242 以下代码输出什么?

难度: 进阶

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.IsDefined(typeof(Color), (Color)3));
  • A. 输出 FalseIsDefined 只认可声明的成员
  • B. 输出 True
  • C. 编译失败
  • D. 抛 ArgumentException
查看答案与解析

正确答案A

解析: (Color)3 虽是合法值,但不在声明成员之列,IsDefined 返回 false。需要校验后再使用。

关键点: 能存 ≠ 已定义;业务校验请用 IsDefined

0243 以下代码输出什么?

难度: 进阶

[Flags]
enum Perms { None = 0, Read = 1, Write = 2, Execute = 4 }

Console.WriteLine(Enum.IsDefined(typeof(Perms), Perms.Read | Perms.Write));
  • A. 输出 True
  • B. 输出 True,Flags 枚举自动识别组合值
  • C. 输出 False,组合值 3 不是声明成员,IsDefined 不认识组合
  • D. 编译失败,组合值不能传给 IsDefined
查看答案与解析

正确答案C

解析: IsDefined 做的是“精确成员匹配”,组合位值不在成员表中。校验 Flags 组合应自行判断位关系。

关键点: IsDefined 对 Flags 组合值不适用。

0244 以下代码输出什么?

难度: 实战

[Flags]
enum Perms { None = 0, Read = 1, Write = 2, Execute = 4 }

Console.WriteLine(Perms.Read | Perms.Write);
  • A. 输出 3
  • B. 输出 ReadWrite
  • C. 抛 OverflowException
  • D. 输出 Read, Write,Flags 枚举的 ToString 把位组合展开为成员名列表
查看答案与解析

正确答案D

解析: [Flags] 本身不改位运算,但会改变 ToString/解析行为:组合值 3 展开成 Read, Write

关键点: Flags 的价值主要在“展示与解析”,不在运算语义。

0245 以下代码输出什么?

难度: 实战

enum E { A = 1, B = 2 }

Console.WriteLine((E)3);
  • A. 输出 3,非 Flags 枚举的组合值没有名称,按数字输出
  • B. 输出 A, B
  • C. 输出 AB
  • D. 抛 ArgumentException
查看答案与解析

正确答案A

解析: 没有 [Flags] 时 ToString 不做位展开;(E)3 未声明,输出数字 3

关键点: 位运算可用不等于 ToString 会展开;展开需要 Flags。

0246 以下代码输出什么?

难度: 进阶

[Flags]
enum F { None = 0, A = 1, B = 2 }

var x = F.A | F.B;

Console.WriteLine(x.HasFlag(F.None));
  • A. 输出 False
  • B. 输出 True0 是任何位集合的子集,HasFlag(0) 恒为真
  • C. 编译失败
  • D. 抛 ArgumentException
查看答案与解析

正确答案B

解析: HasFlag 实现为 (value & flag) == flagflag = 0 时恒成立。用 HasFlag(F.None) 判断“无权限”是错误写法。

关键点: HasFlag(0) 永远为 true,判断空集合别用它。

0247 以下代码输出什么?

难度: 进阶

enum E : byte { B = 2, A = 1, C = 0 }

Console.WriteLine(string.Join(",", Enum.GetValues<E>()));
  • A. 输出 0,1,2
  • B. 输出 C,A,B
  • C. 输出 B,A,CGetValues 按声明顺序返回(.NET 5 起)
  • D. 编译失败,枚举不能作为泛型实参
查看答案与解析

正确答案C

解析: .NET 5 起 Enum.GetValues 返回声明顺序;依赖“按数值排序”的旧代码在 .NET 10 上会得到不同结果。

关键点: GetValues 顺序是声明序,不是数值序。

0248 以下代码输出什么?

难度: 进阶

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.Parse<Color>("5"));
  • A. 抛 FormatException
  • B. 抛 OverflowException
  • C. 编译失败
  • D. 输出 5Enum.Parse 接受数字字符串,成功返回未声明的枚举值
查看答案与解析

正确答案D

解析: Enum.Parse 的数字文本路径直接把字符串当底层数值解析,不做成员校验;"5" 返回 (Color)5。这常被当成“非法值会失败”而误用。

关键点: Parse 成功 ≠ 值是声明成员。

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

难度: 实战

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.Parse<Color>("red"));
  • A. 抛 ArgumentExceptionEnum.Parse 默认区分大小写
  • B. 输出 Red
  • C. 输出 red
  • D. 返回 (Color)0
查看答案与解析

正确答案A

解析: 默认 ignoreCase: false,名称不匹配(大小写不符)抛 ArgumentException。需要忽略大小写必须显式传 true

关键点: Parse 的忽略大小写不是默认行为。

0250 以下代码输出什么?

难度: 实战

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.TryParse<Color>(null, out var a) + "," + a);
Console.WriteLine(Enum.TryParse<Color>("", out var b) + "," + b);
  • A. 两行都输出 True,0
  • B. 两行都输出 False,0null 与空串解析失败且不抛异常,out 为默认值
  • C. 第一行抛 ArgumentNullException
  • D. 第二行抛 FormatException
查看答案与解析

正确答案B

解析: Enum.TryParsenull、空串返回 false,out 置为 default(TEnum);与 Parse 的抛异常行为互补。

关键点: TryParse 的失败路径“安静且可预期”。

0251 以下代码输出什么?

难度: 实战

var a = (x: 1, y: 2);
var b = (p: 1, q: 2);

Console.WriteLine(a == b);
  • A. 编译失败,元素名不同不能比较
  • B. 输出 False
  • C. 输出 True,元组相等性逐元素比较,元素名只是编译期元数据
  • D. 抛 InvalidOperationException
查看答案与解析

正确答案C

解析: 命名元组的元素名不参与类型与相等性;(x: 1, y: 2)(p: 1, q: 2) 是同一个 ValueTuple<int, int>

关键点: 元组名是“便签”,不是类型的一部分。

0252 以下代码输出什么?

难度: 进阶

var a = (s: "ab", n: new int[] { 1 });
var b = (s: "ab", n: new int[] { 1 });

Console.WriteLine(a == b);
  • A. 输出 True
  • B. 输出 True,数组被展开比较
  • C. 编译失败
  • D. 输出 Falsestring 按值比较,int[] 没有 ==,退化为引用比较
查看答案与解析

正确答案D

解析: 元组 == 逐元素使用元素类型的 ==string 有值语义,数组没有自定义 ==,落到引用比较,内容相同也不相等。

关键点: 元组相等性的“深度”取决于每个元素的 ==

0253 以下代码输出什么?

难度: 实战

(int a, int b) t1 = (1, 2);
(int c, int d) t2 = t1;

Console.WriteLine(t2.c);
  • A. 输出 1,元素名不同的元组可以直接赋值,底层类型相同
  • B. 编译失败,元素名必须一致才能赋值
  • C. 输出 0
  • D. 编译失败,元组不能赋值给另一个元组
查看答案与解析

正确答案A

解析: 赋值只看底层类型(ValueTuple<int, int>)与元素类型,元素名被忽略;t2.ct1.a 指向同一语义位置。

关键点: 元素名不阻碍赋值,也不随类型保留。

0254 以下代码输出什么?

难度: 进阶

var a = (d: double.NaN);
var b = (d: double.NaN);

Console.WriteLine(a == b);
  • A. 输出 True
  • B. 输出 False,元组 == 逐元素调用 double==,而 NaN == NaN 为假
  • C. 编译失败,NaN 不能用于元组
  • D. 抛 ArgumentException
查看答案与解析

正确答案B

解析: 元组 == 没有为 double 引入特殊语义;NaN 与自身比较为 false,因此包含 NaN 的元组永远不等于包含 NaN 的元组。

关键点: 元组相等性继承元素类型的比较语义,含 NaN 时“自己不等于自己”。

0255 以下代码能否编译?

难度: 进阶

static (int sum, int count) Stats() => (10, 2);

var dict = new Dictionary<string, (int, int)>
{
    ["k"] = Stats()
};

var v = dict["k"];

Console.WriteLine(v.sum);
  • A. 编译通过,输出 10
  • B. 编译通过,输出 2
  • C. 编译失败,元组进入泛型容器后元素名被抹除,v.sum 不存在
  • D. 编译通过,输出 0
查看答案与解析

正确答案C

解析: 元素名只存在于“当前表达式/局部变量的编译期投影”中;存入 Dictionary<string, (int, int)> 后,类型参数里没有名字,读取时只能 v.Item1

关键点: 命名元组跨泛型边界会“丢名字”。

0256 以下代码输出什么?

难度: 实战

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.GetName(typeof(Color), (Color)7) is null);
  • A. 输出 False
  • B. 输出 7
  • C. 输出 Red
  • D. 输出 TrueGetName 对未声明值返回 null
查看答案与解析

正确答案D

解析: GetName 在成员表中查找名称,找不到返回 null,而不是抛异常。用它做“是否有名称”的判断要处理 null。

关键点: GetName 的“查无此人”是 null,不是异常。

0257 以下代码输出什么?

难度: 实战

enum Color { Red, Green, Blue }

Console.WriteLine(Enum.TryParse<Color>("4", out var c));
Console.WriteLine(c);
  • A. True4TryParse 同样接受数字字符串,成功不代表值是声明成员
  • B. False0
  • C. TrueRed
  • D. 编译失败
查看答案与解析

正确答案A

解析: TryParse 的数字路径与 Parse 一致:"4" 解析为 (Color)4 并返回 true。校验业务合法性仍需 IsDefined

关键点: TryParse 的 true 只代表“解析得了”,不代表“业务合法”。

0258 关于 [Flags] 的语义,哪项正确?

难度: 进阶

  • A. 不加 [Flags] 就不能对枚举使用 |
  • B. [Flags] 不改变数值与位运算语义,只影响 ToString/解析等展示行为;最佳实践是成员取 2 的幂
  • C. [Flags]IsDefined 识别所有组合值
  • D. [Flags] 使枚举只能保存 2 的幂
查看答案与解析

正确答案B

解析: 位运算(|&)对任何枚举都可用;[Flags] 改变的是 ToString 的“拆名”行为与约定。IsDefined 依然不认识组合值。

关键点: Flags 是展示与约定,不是运算开关。

0259 关于值元组的元素名,哪项正确?

难度: 进阶

  • A. 元素名参与类型标识与 == 比较
  • B. 元素名决定运行时内存布局
  • C. 元素名是编译期元数据:不影响类型、相等性、赋值与布局,跨泛型边界会丢失
  • D. 未命名的元组元素只能叫 Item1/Item2,且无法访问
查看答案与解析

正确答案C

解析: 命名只是“语法糖投影”,底层仍是 ValueTuple<T1, T2>;相等性、哈希、赋值都不看名字,泛型化后名字消失。

关键点: 名字服务于可读性,不服务于语义。

0260 把外部字符串安全地转成枚举,哪条路径最完整?

难度: 实战

  • A. Enum.Parse 成功即可使用,无需再校验
  • B. (E)int.Parse(s)Enum.Parse<E>(s) 完全等价
  • C. Enum.TryParse 返回 true 就代表值是已声明成员
  • D. 先解析,再用 Enum.IsDefined(Flags 组合按位校验)确认业务合法性,并对大小写、数字文本显式决策
查看答案与解析

正确答案D

解析: 解析只解决“文本→数值”,合法性校验(IsDefined 或位关系)是另一道防线;数字字符串、大小写、组合值都是常见漏网之鱼。

关键点: 解析与校验是两步,不能合并成一步。

官方资料

当前分类

C# 选择题

查看全部分类 →
  1. 11C# 试题 11:结构体与 ref struct20 题
  2. 12C# 试题 12:record、init 与 required20 题
  3. 13C# 试题 13:枚举与元组20 题
  4. 14C# 试题 14:模式匹配20 题
  5. 15C# 试题 15:泛型基础20 题
ESC

输入关键词开始搜索