C# 为什么我可以将Int转换为IComparable?

C# 为什么我可以将Int转换为IComparable?,c#,boxing,icomparable,C#,Boxing,Icomparable,在一次测验中,我问了一个问题:“下面的人在做什么?” 显然答案是拳击,但我不知道为什么。为什么这被认为是拳击,它在做什么?我的印象是拳击只能发生在对象上 为什么这被认为是拳击 因为您正在通过创建包含值的对象(“框”)将值类型转换为引用类型。它的装箱方式与您使用对象的装箱方式相同 它在干什么 装箱,但结果类型为i可比较 我的印象是拳击只能在物体上进行 不,装箱可以发生在值类型的继承层次结构中的任何引用类型上。实际上,这意味着: 值类型支持的任何接口 对象 ValueType 枚举(用于枚举) 因

在一次测验中,我问了一个问题:“下面的人在做什么?”

显然答案是拳击,但我不知道为什么。为什么这被认为是拳击,它在做什么?我的印象是拳击只能发生在
对象上

为什么这被认为是拳击

因为您正在通过创建包含值的对象(“框”)将值类型转换为引用类型。它的装箱方式与您使用
对象的装箱方式相同

它在干什么

装箱,但结果类型为
i可比较

我的印象是拳击只能在物体上进行

不,装箱可以发生在值类型的继承层次结构中的任何引用类型上。实际上,这意味着:

  • 值类型支持的任何接口
  • 对象
  • ValueType
  • 枚举
    (用于枚举)
  • 因为int(Int32的别名)实现了IComparable

    namespace System
    {
        //
        // Summary:
        //     Represents a 32-bit signed integer.
        public readonly struct Int32 : IComparable, IComparable<Int32>, IConvertible, IEquatable<Int32>, IFormattable
        {
        .
        .
        .
        }
    .
    .
    .
    }
    
    名称空间系统
    {
    //
    //总结:
    //表示32位有符号整数。
    公共只读结构Int32:IComparable、IComparable、IConvertible、IEquatable、IFormattable
    {
    .
    .
    .
    }
    .
    .
    .
    }
    
    IComparable是引用类型,Int32是值类型。因此,当您将Int32强制转换为IComparable时,会发生装箱。

    当您将值“装箱”(或简单地强制转换)到对象类型时,会发生装箱

    最常见的示例是关于将值强制转换为对象:

    var num = 5; //Integer value
    var boxed = (object)num; //object
    

    但是继承链上的任何东西或实现的接口都可以工作,Int32实现了IComparable:

    这并不能解释为什么它被装箱。我只是看到了标题并回答了问题。IComparable是引用类型,Int32是值类型。所以,当您将Int32转换为IComparable时,拳击就发生了。我知道:)我只是想帮助您改进答案。你可以更新你的答案以包含更多的细节,因为人们并不总是阅读所有的评论。
    var num = 5; //Integer value
    var boxed = (object)num; //object