Оператор нуль-коалесценции - зачем кастинг? - PullRequest
4 голосов
/ 13 июня 2011

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

NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, SomeString ?? DBNull.Value); // <-- Throws compilation error!
NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, (object)(SomeString) ?? DBNull.Value); // <-- Compiles!

Я пробовал другие типы, допускающие обнуление, такие как byte?, и получил тот же результат. Может кто-нибудь сказать мне, почему я должен сначала привести к объекту?

Ответы [ 5 ]

10 голосов
/ 13 июня 2011

Вы должны указать компилятору, какой тип использовать. Тип результата оператора слияния null должен совпадать с one типов операндов (или базовым типом первого операнда, если в некоторых случаях это тип значения, допускающий значение NULL). Он не пытается найти «наиболее конкретный тип, в который могут быть преобразованы оба операнда», или что-то в этом роде.

Подробнее о том, как определяется язык, когда дело доходит до оператора объединения нулей, см. В спецификации языка C # 4 , раздел 7.13:

Тип выражения a ?? b зависит от того, какие неявные преобразования доступны для операндов. В порядке предпочтения тип a ?? b равен A0, A или B, где A - это тип a (при условии, что a имеет тип), B - это тип b (при условии, что b имеет тип), а A0 является базовым типом A, если A является обнуляемым типом, или A в противном случае.

9 голосов
/ 13 июня 2011

Первый пример дает сбой, потому что SomeString и DBValue.Null не являются неявно взаимозаменяемыми типами .

4 голосов
/ 13 июня 2011

Это потому, что тип в правой части оператора слияния нуля должен быть неявно преобразован в тип в левой части (или наоборот). Для вашего первого примера задействованы типы string и DBNull. Эти типы не связаны, поэтому преобразование не выполняется.

2 голосов
/ 13 июня 2011

Поскольку выражение должно иметь один тип возвращаемого значения.Поскольку String и DbValue нельзя приводить друг к другу, компилятор не может определить, какой тип возвращаемого значения вы хотите.Когда вы приводите объект к Object, вы предоставляете компилятору тип, на который он может привести.

2 голосов
/ 13 июня 2011

DBValue.Null не является строкой;это объект..NET не будет неявно приведен к Object в выражениях;должно быть явно сказано, что вы ожидаете результата Object.

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