"... по умолчанию == ведет себя так, как описано выше как для предопределенных, так и для пользовательских типов ссылок."
Тип T не обязательно является ссылочным типом, поэтому компилятор не может сделать такое предположение.
Однако, это скомпилируется, потому что это более явно:
bool Compare<T>(T x, T y) where T : class
{
return x == y;
}
Следуйте дополнительному вопросу: «Но если я использую ссылочный тип, будет ли оператор == использовать предопределенное сравнение ссылок, или он будет использовать перегруженную версию оператора, если тип определен один? "
Я бы подумал, что == в Generics будет использовать перегруженную версию, но следующий тест демонстрирует обратное. Интересно ... Я хотел бы знать, почему! Если кто-то знает, пожалуйста, поделитесь.
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
Test a = new Test();
Test b = new Test();
Console.WriteLine("Inline:");
bool x = a == b;
Console.WriteLine("Generic:");
Compare<Test>(a, b);
}
static bool Compare<T>(T x, T y) where T : class
{
return x == y;
}
}
class Test
{
public static bool operator ==(Test a, Test b)
{
Console.WriteLine("Overloaded == called");
return a.Equals(b);
}
public static bool operator !=(Test a, Test b)
{
Console.WriteLine("Overloaded != called");
return a.Equals(b);
}
}
}
выход
Встроенный:
Перегружен == называется
Generic:
Нажмите любую клавишу для продолжения. , .
Follow 2
Я хочу отметить, что изменение моего метода сравнения на
static bool Compare<T>(T x, T y) where T : Test
{
return x == y;
}
вызывает перегруженный оператор ==. Я предполагаю, что без указания типа (например, , где ) компилятор не может сделать вывод, что он должен использовать перегруженный оператор ... хотя я думаю, что у него будет достаточно информации, чтобы принять это решение даже без указания типа.