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. 输出
False,IsDefined只认可声明的成员 - 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. 输出
True,0是任何位集合的子集,HasFlag(0)恒为真 - C. 编译失败
- D. 抛
ArgumentException
查看答案与解析
正确答案B
解析: HasFlag 实现为 (value & flag) == flag;flag = 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,C,GetValues按声明顺序返回(.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. 输出
5,Enum.Parse接受数字字符串,成功返回未声明的枚举值
查看答案与解析
正确答案D
解析: Enum.Parse 的数字文本路径直接把字符串当底层数值解析,不做成员校验;"5" 返回 (Color)5。这常被当成“非法值会失败”而误用。
关键点: Parse 成功 ≠ 值是声明成员。
0249 以下代码运行结果是什么?
难度: 实战
enum Color { Red, Green, Blue }
Console.WriteLine(Enum.Parse<Color>("red"));
- A. 抛
ArgumentException,Enum.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,0,null与空串解析失败且不抛异常,out为默认值 - C. 第一行抛
ArgumentNullException - D. 第二行抛
FormatException
查看答案与解析
正确答案B
解析: Enum.TryParse 对 null、空串返回 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. 输出
False,string按值比较,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.c 与 t1.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. 输出
True,GetName对未声明值返回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.
True和4,TryParse同样接受数字字符串,成功不代表值是声明成员 - B.
False和0 - C.
True和Red - 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 或位关系)是另一道防线;数字字符串、大小写、组合值都是常见漏网之鱼。
关键点: 解析与校验是两步,不能合并成一步。