- 可装箱的可空基础类型可以被强制转换为枚举类型,但可装箱的枚举类型无法被强制转换为可空类型。
同样地,
- 可装箱的可空枚举可以被强制转换为基础类型,但可装箱的基础类型无法被强制转换为可空枚举。
好的,我知道“可装箱的可空类型”不是描述它的最佳方式,但这是为了问题而设定的。我知道被装箱的是基础值类型。
我将用示例来说明。假设我有一个enum
,其中int
是基础类型。
enum Sex { Male, Female }
案例一:
int? i = 1;
object o = i;
Sex e = (Sex)o; //success
//but
Sex e = Sex.Male;
object o = e;
int? i = (int?)o; //invalid cast
案例二:
Sex? e = Sex.Male;
object o = e;
int i = (int)o; //success
//but
int i = 1;
object o = i;
Sex? e = (Sex?)o; //invalid cast
简而言之,
(enum)int? -> succeeds
(int?)enum -> the reverse fails
(int)enum? -> succeeds
(enum?)int -> the reverse fails
甚至更简单地说,
转换为非可空类型 -> 成功
转换为可空类型 -> 失败
现在我知道一旦你将值类型装箱,它只能转换回原始类型。但由于根据C#规则,一个装箱的 int
可以转换为 enum
,一个装箱的 enum
可以转换为 int
,一个装箱的 int
可以转换为 int?
,而一个装箱的 int?
可以转换回 int
,所以我正在寻找其他场景的一致性理解,就像上面列出的那些场景一样。但我不明白其中的逻辑。首先,如果它们全部失败或全部成功,这对开发人员来说会更有意义。 其次,即使是成功的转换,看起来也有点奇怪。我的意思是,由于值类型可以隐式地转换为其可空等效类型(而不是相反),转换为可空类型应该总是成功的,但是在当前的实现中,可空类型正在被成功地转换为非可空类型,如果前者为null,则可能会失败。如果整个过程反过来,那么理解起来会更容易。像这样的一个例子:
Sex? e = null;
object o = e;
int i = (int)o; //succeeds, but sure to explode on cast
//but
int i = 1;
object o = i;
Sex? e = (Sex?)o; //invalid cast, even though its always a safe cast
问题:
那么是哪个C#规则让这种情况发生的?
有没有简单的方法可以帮助我记住这个规则?
int[]
和uint[]
之间进行强制转换。 - Jon Skeet