Сравнение экземпляра типа param со значением null, даже без ограничения класса? - PullRequest
1 голос
/ 10 февраля 2009

Компилируется следующий код:

class Testing<TKey, TValue>
{
    public bool Test(TKey key)
    {
        return key == null;
    }
}

Однако TKey может быть типом значения и, возможно, не разрешать значение «ноль».

Я знаю результаты этой программы и как добавить ограничения. Что мне интересно, так это , почему компилятор не запрещает это, когда TKey не ограничен "class"?

Ответы [ 5 ]

5 голосов
/ 10 февраля 2009

Это удобно делать в разных случаях. Если TKey является типом значения, не допускающим значения NULL, результат сравнения всегда будет ложным. (Вполне возможно, что JITter полностью удалит эту ветвь - не забывайте, что хотя одна версия кода JITted является общей для всех ссылочных типов, она повторно составляет JJ для каждого типа значения.)

РЕДАКТИРОВАТЬ: Одно интересное использование для этого - именно для Nullable<T> сравнения с нулем. TFoo=Nullable<T> не удовлетворяет или ограничениям where TFoo : class или where TFoo : struct.

1 голос
/ 10 февраля 2009

Что касается "почему", я не уверен. Но чтобы это исправить, вы можете использовать default(T) вместо null.

0 голосов
/ 10 февраля 2009

Поскольку TKey может иметь тип NULL.

Поскольку структура C # 2.0 сравнима с нулем. Вот почему вы можете написать 0 == ноль без ошибки компиляции.

0 голосов
/ 10 февраля 2009

потому что все в csharp является объектом.
другими словами Каждый тип в C # прямо или косвенно происходит от типа класса объекта.
Пример

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        struct SimpleStruct
        {
            int a;
            public SimpleStruct(int a)
            {
                this.a = a;
            }
        }
        enum SimpleEnum
        {
            a = 1,
            b = 2,
        }

        static void Main(string[] args)
        {
            SimpleStruct tp = new SimpleStruct(2);

            object ob = tp;
            if (ob != null)
            {
                Console.WriteLine("struct is an object : " + ob);
                tp = (SimpleStruct)ob;
            }

            SimpleEnum tp2 = SimpleEnum.a;
            ob = tp2;
            if (ob != null)
            {
                Console.WriteLine("enum is an object : " + ob);
                tp2 = (SimpleEnum)ob;
            }
            Console.ReadKey();
        }
    }
}
0 голосов
/ 10 февраля 2009

Потому что он приводит вашу переменную к объекту и использует объект == оператор Для типа значения всегда ложно.

...