При перегрузке операторов == и != на использования с разными типами возникает неоднозначность при сравнении с null.
public struct SomeStruct
{
long _member;
String _otherMember;
public SomeStruct(String val)
{
_otherMember = val;
_member = 0;
}
public SomeStruct(long val)
{
_member = val;
_otherMember = null;
}
#region overwrite
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion
#region operators == !=
public static bool operator ==(SomeStruct left, SomeStruct right)
{
return left == right;
}
public static bool operator !=(SomeStruct left, SomeStruct right)
{
return !(left == right);
}
public static bool operator ==(SomeStruct left, String right)
{
return left._otherMember == right;
}
public static bool operator !=(SomeStruct left, String right)
{
return !(left == right);
}
public static bool operator ==(SomeStruct left, long right)
{
return left._member == right;
}
public static bool operator !=(SomeStruct left, long right)
{
return !(left == right);
}
#endregion
#region CAST
public static implicit operator SomeStruct(string value)
{
return new SomeStruct(value);
}
public static implicit operator SomeStruct(long value)
{
return new SomeStruct(value);
}
public static implicit operator long(SomeStruct value)
{
return value._member;
}
public static implicit operator String(SomeStruct value)
{
return value._otherMember;
}
#endregion
};
При использовании
SomeStruct some = 2;
bool bnotNull = some == null;
Возникает неоднозначность
Error 1 The call is ambiguous between the following methods or properties: 'TestProject.SomeStruct.operator ==(TestProject.SomeStruct, TestProject.SomeStruct)' and 'TestProject.SomeStruct.operator ==(TestProject.SomeStruct, string)' C:\Projects\TestProject\TestProject\Program.cs 43 29 TestProject
Вопрос по каким принципам происходит поиск оператора сравнения при сравнении с null.