я натыкался этой интересной ситуацией сегодня:Почему целые числа не поднимаются до удвоений, когда рассматриваются как объекты и сравниваются?
var a = new HashSet<Object> { 1.0, 2.0, 3.0 };
a.Contains(1); //False
a.Contains(1.0); //True
Конечно, это всего лишь общая версия этого:
Object b = 2.0;
b.Equals(2); //False
b.Equals(2.0); //True
Я понимаю, что причина этого в том, что если я пишу 2.0 == 2
, то Компилятор C# тайно вставляет листинг из целого числа в double, и с помощью промежуточного объекта Object у компилятора недостаточно информации для этого.
Мой вопрос в том, есть ли у времени выполнения достаточно информации, чтобы поднять целое число в два раза для сравнения? Если компилятор C# предполагает, что желательно иметь неявное преобразование, почему JIT не должен иметь подобное поведение?
JIT! = Время работы. Если вы хотите, чтобы эта работа работала, вы хотите понять ее во время выполнения, а не во время компиляции JIT. И если вы хотите, чтобы это «фигурировало» во время выполнения, есть слово для этого: динамическое. Используйте экономно. –
Я бы порекомендовал это стать сообществом wiki, так как не обязательно существует конкретное решение, которое разрешает проблему. – galford13x
@ user414076 Это не вопрос «почему мой код не работает». Это вопрос «почему они решили реализовать это таким образом». – MgSam