Зачем разрешается сравнивать non-nullable value типы с null?
От: Аноним  
Дата: 04.07.08 13:06
Оценка:
Привет.
Зачем разрешается сравнивать non-nullable value типы с null?

class Program
{
    static void Main()
    {
        if(1 == null) { }
    }
}


Какие вообще правила насчет того, где можно применять оператор == и как он работает?
Re: Зачем разрешается сравнивать non-nullable value типы с n
От: Аноним  
Дата: 04.07.08 13:13
Оценка:
А>Какие вообще правила насчет того, где можно применять оператор == и как он работает?

Почему, например, нельзя так?

class Program
{
    static void Foo<T>(T x) where T : struct
    {
        if(x == null) { } // Тоже value-тип.
    }
}


И еще вопрос: какого типа правый операнд оператора == в следующем примере:

class Program
{
    static void Foo<T>(T? x) where T : struct
    {
        if (x == null) { }
    }
}


Спасибо.
Re: Зачем разрешается сравнивать non-nullable value типы с n
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 04.07.08 13:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Зачем разрешается сравнивать non-nullable value типы с null?

А>Какие вообще правила насчет того, где можно применять оператор == и как он работает?

Существует стандарт языка. Там это все разжевано по полочкам (за исключением ряда тонких мест).

В данном конкретно случае к "1" применяется lifted conversion operator из int в int?, и потом сравнивается
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[2]: Зачем разрешается сравнивать non-nullable value типы
От: Severn Россия  
Дата: 04.07.08 19:56
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Почему, например, нельзя так?


А>
А>class Program
А>{
А>    static void Foo<T>(T x) where T : struct
А>    {
А>        if(x == null) { } // Тоже value-тип.
А>    }
А>}
А>


это мне тоже не совсем понятно. вроде implicit conversion S->S? есть для всех структур. Однако такое выражение уже не откомпилируется.

        public struct V {}
        static void Foo(V i)
        {
            if (null == i)
            { }
        }




А>И еще вопрос: какого типа правый операнд оператора == в следующем примере:




7.9.9 Equality operators and null
The == and != operators permit one operand to be a value of a nullable type and the other to be the null literal, even if no predefined or user-defined operator (in unlifted or lifted form) exists for the operation.
For an operation of one of the forms
x == null null == x x != null null != x
where x is an expression of a nullable type, if operator overload resolution (§7.2.4) fails to find an applicable operator, the result is instead computed from the HasValue property of x. Specifically, the first two forms are translated into !x.HasValue, and last two forms are translated into x.HasValue.

Re[2]: Зачем разрешается сравнивать non-nullable value типы
От: Severn Россия  
Дата: 04.07.08 20:01
Оценка:
Здравствуйте, xvost, Вы писали:

X>В данном конкретно случае к "1" применяется lifted conversion operator из int в int?, и потом сравнивается


lifted — это же вроде между двумя nullable типами. int->int? это просто implicit conversion, в Nullable<T> определено.
Re[2]: Зачем разрешается сравнивать non-nullable value типы
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.07.08 20:23
Оценка:
Здравствуйте, xvost, Вы писали:

X>В данном конкретно случае к "1" применяется lifted conversion operator из int в int?, и потом сравнивается


Преобразование int -> int? это не lifted conversion operator (6.4.2), а implicit nullable conversion (6.1.4). Потому как lifted conversion operators формируются только из user-defined conversion operators.
А вот оператор == здесь — это lifted operator (7.2.7).
Re[3]: Зачем разрешается сравнивать non-nullable value типы
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.07.08 20:29
Оценка: 6 (1)
Здравствуйте, Severn, Вы писали:

S>это мне тоже не совсем понятно. вроде implicit conversion S->S? есть для всех структур. Однако такое выражение уже не откомпилируется.

S>
S>        public struct V {}
S>        static void Foo(V i)
S>        {
S>            if (null == i)
S>


Дело в том, что в случае с int существует predefined operator == с сигнатурой bool operator==(int,int), а поэтому согласно 7.2.7 Lifted operators существует lifted operator с сигнатурой bool operator==(int?,int?). А для V таких операторов нет.
Re[3]: Зачем разрешается сравнивать non-nullable value типы
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.07.08 20:34
Оценка:
Здравствуйте, Severn, Вы писали:

S>lifted — это же вроде между двумя nullable типами. int->int? это просто implicit conversion, в Nullable<T> определено.


Тот факт, что такое преобразование определено в Nullable<T>, совершенно не имеет значения, компилятор игнорирует его. Преобразование T -> T? это предопределенное преобразование, а именно implicit nullable conversions (6.1.4), оно обрабатывается компилятором специальным образом. Но я согласен, что это ни как не lifted conversion operator (6.4.2).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.