C # null - это объект - PullRequest
       2

C # null - это объект

6 голосов
/ 03 июня 2011

Когда я писал код на C # несколько дней назад, я заметил, что компилятор пожаловался на то, что мне пришлось привести null к определенному объекту.

Означает ли это, что null - это просто необоснованная версия типа? Или это одноэлементное значение класса Null, подобного Java (даже если оно имеет особые привилегии)?

РЕДАКТИРОВАТЬ: пример кода с ошибкой будет:

public String duplicate(String toDuplicate)
{
    return toDuplicate + toDuplicate;
}

public String duplicate(int? toDuplicate)
{
    String asString = toDuplicate.toString();

    return asString + asString;
}

public static int Main(string[] args)
{
    //This needs to be cast:
    duplicate(null);
    //To:
    duplicate((string)null);
}

Причина, по которой я прокомментировал null в Java, была после прочтения этого:

Существует также специальный нулевой тип, тип выражения null, которое имеет без имени. Поскольку нулевой тип не имеет имя, невозможно объявить переменная нулевого типа или для приведения к нулевому типу. Нулевая ссылка является единственно возможным значением выражение нулевого типа. Ноль Ссылка всегда может быть приведена к любому ссылочный тип. На практике программист может игнорировать нулевой тип и просто притворяться, что ноль просто специальный литерал, который может быть любого ссылочный тип.

Нашел здесь: Является ли NULL объектом?

Ответы [ 6 ]

6 голосов
/ 03 июня 2011

Я получаю сообщение об ошибке, когда у меня перегружены методы, и компилятор не может решить, какой метод вызывать во время компиляции.Это все?

5 голосов
/ 03 июня 2011

В соответствии с описанием MSDN :

Ключевое слово null - это литерал, представляющий нулевую ссылку, который не относится ни к одному объекту.null - это значение по умолчанию для переменных ссылочного типа.Типы обычных значений не могут быть нулевыми.Однако в C # 2.0 были введены типы значений, допускающие значение NULL.

1 голос
/ 03 июня 2011

Вы, вероятно, ссылаетесь на тот факт, что следующее приводит к ошибке компилятора:

int? nullableInt = (somecondition) ? value : null;

На самом деле вам нужно добавить актерский состав здесь:

int? nullableInt = (somecondition) ? value : (int?)null;

Хотя я не могу объяснить это подробно, я подозреваю следующее:

int? на самом деле является краткой формой для Nullable<int>, так что это в основном экземпляр объекта. При назначении значения int для nullableInt свойство Nullable<int> будет установлено внутри. Непосредственное присвоение null также будет в порядке.

Однако условное присваивание вернет два разных типа: int в случае, если somecondition равно true и object (null) в противном случае.

Теперь компилятор не знает, как с этим справиться, поскольку троичный оператор должен возвращать значения того же типа. Поэтому вам нужно указать желаемый «тип для значения null».

Извините, если это не очень глубокое техническое объяснение - я уверен, что есть кто-то, кто мог бы уточнить это лучше, но это могло бы помочь понять это лучше.

1 голос
/ 03 июня 2011

Нет - ноль - это просто литерал для нулевой ссылки.

Причина, по которой вам нужно «привести» его таким образом (я поместил слово cast в кавычки, потому что вы на самом деле не приводите экземпляр чего-либо), заключается просто в том, чтобы помочь компилятору решить, какую перегрузку вызываемого вами метода или метод, который вы вызываете, даже существует.

В вашем примере вам нужно указать, что вы вызываете метод «duplicate», который принимает один строковый аргумент. Если вы опустите приведение, то компилятор знает только, что метод, который вы намеревались вызвать, называется «дубликат» и имеет единственный аргумент, но не может определить тип аргумента - вы хотели вызвать duplicate(string) или сделали ты хочешь позвонить duplicate(some other type)? Должен ли он скомпилироваться или он сообщит вам, что метод, который вы пытаетесь вызвать, не существует?

Вы также получите ту же проблему, если у вас был определен дубликат (byte []), потому что теперь ваш вызов неоднозначен без явного приведения.

1 голос
/ 03 июня 2011

Нет, это не объект. null - это значение по умолчанию для переменных ссылочного типа. Типы обычных значений не могут быть нулевыми. но есть другой набор, называемый nullable types.

1 голос
/ 03 июня 2011

null - это «неоплаченная ссылка» для любого типа. Это не ценность. null не имеет определенного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...