У меня есть следующий код:
class Program
{
static void Main(string[] args)
{
Test test = new Test();
object objTest = test;
Console.WriteLine(test.GetType()); // Output: "OperatorOverload.Test"
Console.WriteLine(objTest.GetType()); // Output: "OperatorOverload.Test"
Console.WriteLine(test == null); // Output: "True"
Console.WriteLine(objTest == null); // Output: "False"
test.Equals(null); // Output: "Hi!"
objTest.Equals(null); // Output: "Hi!"
Console.ReadLine();
}
}
Тест выглядит так:
class Test
{
public static bool operator ==(Test obj1, Test obj2)
{
return true;
}
public static bool operator !=(Test obj1, Test obj2)
{
return !(obj1 == obj2);
}
public override bool Equals(object obj)
{
Console.WriteLine("Hi!");
return true;
}
}
Представляется, что перегрузка оператора работает только тогда, когда тип переменной, с которой вы имеете дело, является классом, в котором определена перегрузка оператора. Я понимаю, почему это так, поскольку я ищу безопасный проверки, равен ли объект нулю.
Мои вопросы:
Перегруженные операторы работают только в том случае, если тип переменной - это класс, в котором определен оператор (мой код говорит мне «да», но я мог ошибиться)?
Является ли следующий код безопасным способом проверки, равен ли объект нулю?
SomeClass obj = new SomeClass(); // may have overloaded operators
if ((object)obj == null)
{
// ...
}