C #, безусловно, не позволяет неявное преобразование объектов в int
s для любых целей. Я не уверен, что вы имеете в виду строку
bool butNotHere = valueOnly == (ValueOnly)valuePair;
как «разрешающий» такое преобразование. Если это так, он не делает ничего подобного. Он просто вызывает ваш собственный оператор преобразования (который, если я правильно прочитал код, вернет null
, так как значение будет построенным по умолчанию целым числом), а затем выполняет сравнение ссылок между двумя объектами (которое оценивается как false
как null
не является ни чем-либо ссылочным).
Также само собой разумеется, что как только вы определили оператор неявного преобразования, C # будет использовать его всякий раз, когда это необходимо. Поэтому я думаю, что ваш вопрос больше связан с пониманием того, как работает оператор равенства на основе типов его аргументов, чем с чем-либо еще.
Обновление, касающееся проверки valueOnly == valuePair
:
Спецификация C #, 7.10.6 (Операторы равенства ссылочного типа) гласит:
Ошибка времени привязки использовать предопределенный тип ссылки
операторы равенства для сравнения двух ссылок, которые, как известно,
отличается во время связывания. Например, если типы времени привязки
операнды - это два типа классов A и B, и если ни A, ни B
вытекает из другого, то это было бы невозможно для двух
операнды для ссылки на один и тот же объект. Таким образом, операция
считается ошибкой времени привязки.
Если вы хотите иметь возможность сравнивать объекты типа класса на равенство, лучшим способом является реализация интерфейса IEquatable<T>
и переопределение object.Equals
для реализации в терминах IEquatable<T>.Equals
(это означает, что вы будете также необходимо переопределить object.GetHashCode
) для соответствия.
Однако при сравнении предметов полагаться на «скрытые» преобразования плохая идея. Если мы говорим о сравнении несвязанных классов, вы избавите себя от мучений в будущем, сделав сравнение как можно более заметным. Для этого я бы предложил низкотехнологичные
if(valuePair.Value == valueOnly.Value)