为什么以下断言失败(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[] { };
因此,您只是不能让它隐含地施放到目标类型。
为什么将
IList
到List<UInt16>
的铸件有效,但IList
的演员 到IList<UInt32>
无效?
在我开始用文字解释之前,请阅读Jon Skeets答案:
您不能直接在C#中的
int[]
和uint[]
之间施放 语言不认为有任何转换。但是,如果你 通过对象(在我的示例中*或IList
(进行操作。结果是CLI。
CLI规格第8.7
可以将签名和未签名的积分原始类型分配给每个类型 其他;例如,
int8 := uint8
有效。为此,bool
应为 被认为与uint8
兼容,反之亦然,这使Bool:= UINT8有效,反之亦然。签名阵列也是如此 和相同大小的未签名积分原始类型;例如,int32[] := uint32[]
有效。