Ответ 1
В данном примере это бессмысленно.
Хотя в этом случае это неприменимо, иногда возникает необходимость выбросить нуль (или, по крайней мере, до добавления значения по умолчанию (T). Рассмотрим следующее:
void DoSomething(string x) {
...
}
void DoSomething(object x) {
...
}
DoSomething(null); // compiler can't infer the type
DoSomething((string)null); // string type is now explicit
DoSomething(default(string)); // same as previous
ИЗМЕНИТЬ
Просто подумал о другом случае, когда вам нужно было сделать актерский состав при тестировании равенства. Если у вас был объект с перегруженным оператором ==, который допускал сравнение с двумя ссылочными типами, сравнение с нулем было бы неоднозначным. Однако, поскольку IQueryableContext, скорее всего, интерфейс и интерфейсы не могут перегружать оператор ==, я до сих пор не вижу никакой веской причины сделать это в примере, который вы дали.
class CustomObject {
private string _id;
public CustomObject(string id) {
_id=id;
}
public static bool operator ==(CustomObject lhs, CustomObject rhs) {
if (ReferenceEquals(lhs, rhs)) { return true; }
if (ReferenceEquals(lhs, null)) { return false; }
if (ReferenceEquals(rhs, null)) { return false; }
return lhs._id == rhs._id;
}
public static bool operator !=(CustomObject lhs, CustomObject rhs) {
return !(lhs == rhs);
}
public static bool operator ==(CustomObject lhs, string rhs) {
if (ReferenceEquals(lhs, rhs)) { return true; }
if (ReferenceEquals(lhs, null)) { return false; }
if (ReferenceEquals(rhs, null)) { return false; }
return lhs._id == rhs;
}
public static bool operator !=(CustomObject lhs, string rhs) {
return !(lhs==rhs);
}
}
CustomObject o = null;
if (o == null) {
Console.WriteLine("I don't compile.");
}