Я только что столкнулся с этой ситуацией и подумал, что это хорошая возможность использовать ключевое слово по умолчанию. Но это не компилируется, и я не могу понять, почему. Пример ниже иллюстрирует мою проблему:
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result != default(TDataSource);
}
}
Вы получите ошибку в строке 8 («Оператор '==' не может быть применен к операндам типа« TDataSource »и« TDataSource ».»). Я думал, что использование ключевого слова по умолчанию устранит любые проблемы сравнения между ссылочными типами и типами значений.
Добавление общего ограничения, ограничивающего TDataSource для ссылочных типов, делает этот фрагмент кода компилируемым.
Может кто-нибудь объяснить, почему компилятор не исправит это для меня? Разве это не достаточно умно, чтобы увидеть, что это сработает?
Это связано:
Не может ли оператор == применяться к универсальным типам в C #?
[Изменить]
Ответ SLaks дал мне некоторое вдохновение, оператор '==' не будет работать, но функция Equals должна.
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result.Equals(default(TDataSource));
}
}
Компилирует ли эта функция правильно?