C# 如果A和B是枚举类型,为什么我可以将A[]强制转换为B[]?

C# 如果A和B是枚举类型,为什么我可以将A[]强制转换为B[]?,c#,arrays,casting,enums,C#,Arrays,Casting,Enums,enum使代码在许多情况下更易于阅读和理解。但我不明白什么时候我可以像下面这样使用这句话: public enum A { apple,orange,egg } public enum B { apple,orange,egg } public static void main() { A[] aa = (A[])(Array) new B[100]; } 有谁能给我一些源代码示例,我可以在哪里使用这种类型的枚举数组。显然,如果基础类型的枚举数组和基础类型的枚举数组大小

enum使代码在许多情况下更易于阅读和理解。但我不明白什么时候我可以像下面这样使用这句话:

public enum A
{
    apple,orange,egg
}
public enum B
{
    apple,orange,egg
}
public static void main()
{
    A[] aa = (A[])(Array) new B[100];
}
有谁能给我一些源代码示例,我可以在哪里使用这种类型的枚举数组。

显然,如果基础类型的枚举数组和基础类型的枚举数组大小相同,CLR允许在这两种类型的枚举数组之间进行转换。在我链接的问题中,这个案例是
(sbyte[])(object)(byte[])
,这同样令人惊讶

基础类型–在CTS枚举中是现有类型的备用名称 (§I.8.5.2),称为其基本类型。签名匹配除外(§I.8.5.2)

三、 4.3卡斯特说

如果obj的实际类型(不是验证器跟踪类型)是验证器可分配给typeTok类型的 演员成功了

castclass
是C#编译器用于执行此强制转换的指令


事实上,枚举成员在您的示例中是相同的,这与问题无关。还要注意,没有创建新对象。它实际上只是一个对象引用的类型转换。

这太奇怪了-您将用这段代码实现什么?写这篇文章并问这个问题的原因是什么?这只是一个样本。我的主要问题是使用这种类型的枚举数组,比如“A[]aa=(A[])(array)new B[100];“你可以不给任何代码,但必须像那样强制转换枚举数组基本上,虽然它不是“类型安全的”,但它是内存访问安全的,因为数组边界检查将阻止对数组末尾的访问,只要真实类型和用于访问的类型大小相同。因为你不能破坏运行时,只有你自己的数据.NET允许它,如果你坚持的话。