4

一个小时前我问了一个问题:我怎么能写一个扩展方法,因为Enum?-Nullable<Enum>
我得到一个答案,告诉我我可以写扩展方法Enum,它可以用于所有枚举和可为空的枚举。

酷,它有效,但如何?

如果我理解正确,所有枚举都来自于Enum这就是为什么我可以在我拥有的每个枚举中使用这个扩展方法。

但是...ItemType?例如,枚举不是枚举,它是Nullable<ItemType>,它不是从ItemTypenor派生的Enum
就像List<DataReader>不派生自DataReader,因此不能使用DataReader方法一样,尽管DataReader它是通用类型

我知道该Nullable<T>类型有很多“巫毒”和语法糖,这是其中之一吗?

4

3 回答 3

5

扩展方法不需要类是/派生的/,它们只需要存在转换(更具体地说:隐式标识、引用或装箱转换;这是第 7.6.5.2 节“扩展方法调用”)。

Nullable<ItemType>to的转换System.Enum是拳击转换;Nullable<int>与从到的转换相同System.Object

如果你定义了自己的结构struct Test : IMyInterface {},就会有从Nullable<Test>to的转换IMyInterface

如果 nullable 为 null,则来自 nullable 的装箱转换将返回 null 引用;否则将 nullable 的值装箱。有关详细信息,请参阅 C# 规范中的第 6.1.7 节“装箱转换”。

于 2012-10-18T17:00:39.813 回答
2

它比编译器魔法更具有类型系统魔法。由于Enum是引用类型,这意味着您传入的任何值都将被装箱(例如转换为引用)。

现在Nullable<T>在 CLR 中进行了特殊处理,null如果它表示空值或内部类型 ( T) 的装箱值,装箱将产生枯萎,但绝不会装箱Nullable<T>。当然,反之亦然。拆箱到可为空的类型接受null引用。

于 2012-10-18T17:05:43.097 回答
1

扩展方法被转换为一个静态方法,其第一个参数是调用该方法的变量。

在 Enum 示例中,由于 Enum 是一个类(不是结构),因此扩展方法可以接受枚举的具体值(通常归结为 int)或 null。因此它适用于可为空的枚举。

同样的事情对 int 不起作用?(可以为空)。如果您为 int 创建扩展方法,您将无法在 Nullable 上调用它(它会告诉您“无法将实例参数类型 Nullable 转换为 int)

于 2012-10-18T16:56:27.757 回答