Я просто столкнулся с этой ситуацией и подумал, что это хорошая возможность использовать ключевое слово по умолчанию. Но это не компилируется, и я не могу понять, почему. Приведенный ниже пример иллюстрирует мою проблему:
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));
}
}
Это скомпилирует эту функцию правильно?