Рассмотрим следующий метод:
public bool IsNullString<T>(T item) {
return typeof(T) == typeof(string) && item == null;
}
Да, это патетически глупый метод, и использование дженериков здесь бессмысленно, но вы увидите точку за мгновение.
Теперь рассмотрим
bool first = IsNullString<string>(null);
bool second = IsNullString<Foo>(null);
bool third = IsNullString(null);
. В первом и втором компиляторе можно четко различать тип T
(не требуется никакого вывода). В третьем, как компилятор делает вывод о том, что T
? В частности, он не может различать T == string
и T == Foo
или любой другой тип в этом отношении. Поэтому компилятор должен дать вам ошибку времени компиляции.
Если вы хотите обойти это, вам нужно либо бросить null
EqualTo((object)null);
, либо явно указать тип
EqualTo<object>(null)
или определить перегрузку
private static Matcher<object> EqualTo(object item) {
return new IsEqual<object>(item);
}