为什么类型(IList<uint>)。IsAssignableFrom(typeof(int[]) 返回 true?



为什么以下断言失败(IsAssignableFrom返回true(:

Assert.False(typeof(IList<UInt16>).IsAssignableFrom(typeof(Int16[])) Assert.False(typeof(IList<Int16>).IsAssignableFrom(typeof(UInt16[])) Assert.False(typeof(IList<UInt32>).IsAssignableFrom(typeof(Int32[])) Assert.False(typeof(IList<Int32>).IsAssignableFrom(typeof(UInt32[])) Assert.False(typeof(IList<UInt64>).IsAssignableFrom(typeof(Int64[])) Assert.False(typeof(IList<Int64>).IsAssignableFrom(typeof(UInt64[]))

我本来希望他们失败(IsAssignableFrom应该返回false(,因为这会导致编译器错误:

IList<UInt16> x = new Int16[]{}; // CS0029 Cannot implictly convert ...
IList<Int16> x = new UInt16[]{}; // CS0029 Cannot implictly convert ...
IList<UInt32> x = new Int32[]{}; // CS0029 Cannot implictly convert ...
IList<Int32> x = new UInt32[]{}; // CS0029 Cannot implictly convert ...
IList<UInt64> x = new Int64[]{}; // CS0029 Cannot implictly convert ...
IList<Int64> x = new UInt64[]{}; // CS0029 Cannot implictly convert ...

它是可分配的,因为如果您明确施放,它可以工作:

IList<UInt16> x = (IList<UInt16>)(IList)new Int16[] { };

因此,您只是不能让它隐含地施放到目标类型。

为什么将IListList<UInt16>的铸件有效,但IList的演员 到IList<UInt32>无效?

在我开始用文字解释之前,请阅读Jon Skeets答案:

您不能直接在C#中的int[]uint[]之间施放 语言不认为有任何转换。但是,如果你 通过对象(在我的示例中*或IList(进行操作。结果是CLI。

CLI规格第8.7

可以将签名和未签名的积分原始类型分配给每个类型 其他;例如,int8 := uint8有效。为此,bool应为 被认为与uint8兼容,反之亦然,这使Bool:= UINT8有效,反之亦然。签名阵列也是如此 和相同大小的未签名积分原始类型;例如,int32[] := uint32[]有效。

最新更新