2015-07-26 3 views
1

Рассмотрим следующий код:Как сравнить значение двух вставных переменных?

object a1 = (int) 2; 
object a2 = (long) 2; 
a1 == a2 //False 

Я знаю, что бокс происходит здесь и == оператор в настоящее время сравнивает равенство двух ссылок (a1 и a2).

Проблема в том, что я хочу сравнить значения a1 и a2. Как я могу это сделать?

PS: В моей реальной жизни проблемы я не знаю точные типы a1 и a2. Они могут быть любыми ссылочными типами типов значений.

ответ

2

int и long никогда не равны, так что ...

Перегрузка == использования фиксируется во время компиляции. За исключением, если вы скажете:

(dynamic)a1 == (dynamic)a2 

в этом случае связывание (?, Который перегрузки) происходит во время выполнения, которые должны реально работать в вашем примере, так как существует перегрузка:

bool operator ==(long, long) 

встроенный -в в C#.

Предупреждение: Привязка может завершиться неудачей, и если вы используете dynamic, вы можете запустить исключение (время выполнения) из-за этого. Что-то вроде:

dynamic a1 = 2; 
dynamic a2 = "two"; 
dynamic test = a1 == a2; // Bang? 

Если вы не хотите dynamic, вы можете попробовать с Convert.ChangeType если либо comparand может быть его тип изменен, чтобы соответствовать типу другого. Затем вы можете позвонить Equals, который находится в virtual, и найдет переопределенную реализацию (например, int.Equals или long.Equals, каждая из которых переопределяет object.Equals).

+0

Итак, почему '(int) 2 == (long) 2' возвращает true? И что произойдет Если я не буду развиваться в C# 4? – alisabzevari

+1

@alisabzevari, это потому, что оператор '==' перегружен для 'long', поэтому неявное преобразование производится из' int' в 'long' –

+0

Итак, почему они не использовали неявное преобразование в' int.Equals' и 'long.Equals'? Я думаю, что это может решить проблему. – alisabzevari

1

Лучшим способом было бы сбросить переменные, переведя их в их тип подделки.

Если по какой-то причине вы не знаете типы, это самый простой способ достичь этого, если вы не знаете, какие типы базовых переменных должны использовать динамические языковые функции на C#.

object a1 = (int) 2; 
object a2 = (long) 2; 
a1 == a2 // False 
(dynamic) a1 == (dynamic) a2 // True 

Учтите, что это медленно, и то, что вы пытаетесь достичь, обычно можно улучшить с помощью явных приемов.