Сравнение универсального типа со значением по умолчанию без ограничения универсального класса дает ошибку времени компиляции

Я просто столкнулся с этой ситуацией и подумал, что это хорошая возможность использовать ключевое слово по умолчанию. Но это не компилируется, и я не могу понять, почему. Приведенный ниже пример иллюстрирует мою проблему:

public class Test
{
    public IQueryable DataSource { get; set; }

    public bool GetOneOrDefaultResult()
    {
        var result = DataSource.SingleOrDefault();
        return result != default(TDataSource);
    }
}

Вы получите сообщение об ошибке в строке 8 («Оператор» == не может быть применен к операндам типа «TDataSource» и «TDataSource».). Я думал, что использование ключевого слова по умолчанию устранит любые проблемы сравнения между ссылочными типами и типами значений.

Добавление общего ограничения, ограничивающего TDataSource ссылочными типами, делает этот фрагмент кода компилируемым.

Может кто-нибудь объяснить, почему компилятор не исправит это для меня? Разве это не достаточно умно, чтобы увидеть, что это сработает?

Это связано: Не может ли оператор == быть применен к универсальным типам в C #?

[Редактировать] Ответ SLaks дал мне некоторое вдохновение, оператор '==' не будет работать, но функция Equals должна.

    public class Test
{
    public IQueryable DataSource { get; set; }

    public bool GetOneOrDefaultResult()
    {
        var result = DataSource.SingleOrDefault();
        return result.Equals(default(TDataSource));
    }
}

Это скомпилирует эту функцию правильно?

8
задан Community 23 May 2017 в 12:07
поделиться