Почему я могу привести Int к IComparable? - PullRequest
4 голосов
/ 28 февраля 2020

У меня был вопрос в викторине, который спрашивал: «Что делает следующее?»:

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

Очевидно, ответ - бокс, но я не знаю почему. Почему это считается боксом и чем он занимается? У меня сложилось впечатление, что бокс может случиться только с object.

Ответы [ 3 ]

9 голосов
/ 28 февраля 2020

Почему это считается боксом

Поскольку вы преобразовываете тип значения в ссылочный тип, создавая объект («ящик»), содержащий значение. Это бокс так же, как вы привыкли к object.

что он делает

Бокс, но с типом результата IComparable .

У меня сложилось впечатление, что бокс может происходить только с объектом.

Нет, бокс может происходить с любым ссылочным типом, который находится в иерархии наследования типа значения. В действительности это означает:

  • Любой интерфейс, поддерживаемый типом значения
  • object
  • ValueType
  • Enum (для перечисления)
0 голосов
/ 28 февраля 2020

Бокс происходит, когда вы «помещаете» (или просто приводите) значение в тип объекта.

Наиболее распространенный пример - приведение значения к объекту:

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

0 голосов
/ 28 февраля 2020

Поскольку 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, происходит бокс.

...