代码之家  ›  专栏  ›  技术社区  ›  bitbonk

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

  •  1
  • bitbonk  · 技术社区  · 7 年前

    为什么以下断言失败( 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 ...
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   bitbonk    7 年前

    它是可赋值的,因为如果显式强制转换:

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

    因此,您不能让它隐式地强制转换到目标类型。

    为什么演员阵容来自 IList List<UInt16> 有效,但从 IList公司 IList<UInt32> 无效的

    在我开始用我的话解释之前,请阅读 Jon Skeets answer :

    你不能直接在 int[] uint[] 在C#中,因为 语言不认为有任何转换可用。但是,如果您 通过对象(*或 IList公司 在我的示例中)结果取决于CLI。

    CLI规范第8.7节

    可以为每个 另外e、 g。, int8 := uint8 是有效的。为此目的, bool 应该是 认为与兼容 uint8 反之亦然,这使得布尔:= uint8有效,反之亦然。对于有符号数组也是如此 和大小相同的无符号整数基元类型;e、 g。, int32[] := uint32[] 是有效的。