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

Why Can I Cast an Int to IComparable?

我有一个关于 "What is the following doing?" 的测验问题:

// Value is an int
IComparable thing = (IComparable)value;

貌似答案是拳击,但我不知道为什么。为什么这被认为是拳击,它在做什么?我的印象是拳击只能发生在 object.

Why is this considered boxing

因为您要通过创建包含该值的对象 ("box") 将值类型转换为引用类型。它的拳击方式与您习惯使用 object.

的方式相同

what is it doing

装箱,但结果类型为 IComparable

I was under the impression that boxing can only happen with object.

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

  • 值类型支持的任何接口
  • object
  • ValueType
  • Enum(对于枚举)

因为 int(Int32 的别名)实现了 IComparable。

namespace System
{
    //
    // Summary:
    //     Represents a 32-bit signed integer.
    public readonly struct Int32 : IComparable, IComparable<Int32>, IConvertible, IEquatable<Int32>, IFormattable
    {
    .
    .
    .
    }
.
.
.
}

IComparable是引用类型,Int32是值类型。因此,当您将 Int32 转换为 IComparable 时,发生了装箱。

装箱发生在您 "box"(或者,简单地说,强制转换)一个对象类型的值。

最常见的示例是将值转换为对象:

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

但是继承链或实现的接口上的任何东西都有效并且 Int32 实现了 IComparable:https://docs.microsoft.com/en-us/dotnet/api/system.int32?view=netframework-4.8