2010-04-16 2 views

ответ

17

Нет, это не помещено в нетипизированный объект. Для каждого типа значений в CLR имеется тип ссылочного типа. Таким образом, вы бы что-то вроде:

public class BoxedInt32 // Not the actual name 
{ 
    private readonly int value; 
    public BoxedInt32(int value) 
    { 
     this.value = value; 
    } 
} 

Это коробочный тип непосредственно не доступен в C#, хотя в C++/CLI. Очевидно, что он знает оригинальный тип. Поэтому в C# у вас должен быть тип компиляции object для переменной, но это не значит, что это фактический тип объекта.

Для получения более подробной информации см. ECMA CLI spec или CLR via C#.

+0

межжала, спасибо Джон. Эффективный C# Вагнера гласит: «Бокс помещает тип значения в нетипизированный ссылочный объект». Я уверен, что это также говорит о том, что объекты в коробке не содержат метаданных типа, хотя я не могу найти эту конкретную цитату прямо сейчас. Это было когда я читал эту книгу, что вопрос возник ко мне. – fearofawhackplanet

+0

@fearofawhackplanet: Я бы не хотел вставлять слова в рот Билла о том, что он имел в виду, - но объект коробки, который определенно * *, знает свой первоначальный тип, включая перечисления. (Вставьте значение перечисления, а затем используйте ToString напрямую без распаковки для доказательства этого). –

+1

Я считаю, что это хорошая демонстрация. 'long l = 40L; объект o = (объект) l; Console.WriteLine (o.GetType()); 'В этом случае System.Int64 печатается на экране. Даже если 'o' является объектом, базовый тип все еще длинный. –

6

Ответ Джона Скита охватывает причину; как и для как получить вокруг него, вот что вы должны сделать:

long l = 1; 
object obj = (object)l; 
double d = (double)(long)obj; 

Причиной двойного броска это; когда .NET распаковывает эту переменную, она знает, как ее можно удалить в тип, из которого она была помещена в коробку (long в вашем примере.) После того, как вы распаковали ее, и у вас есть правильный long примитив, вы можете затем перевести его на double или любой другой тип, отлитый от long.

Смежные вопросы