Почему 1 из объекта типа не может быть приведен к двойному - PullRequest
2 голосов
/ 13 декабря 2011

Когда я хочу разыграть 1 на удвоение, это не работает. Когда я разыгрываю 1.0, чтобы удвоить, это работает. Почему?

У меня есть следующий код:

static void Main(string[] args)
{

    ArrayList liste1 = new ArrayList();
    liste1.Add(1);
    liste1.Add("Hallo");
    liste1.Add(2.5);

    double num = (double)liste1[0] + (double)liste1[2];

    Console.WriteLine(num);

    Console.ReadLine();
}

Когда я изменяю liste1.Add(1); на liste1.Add(1.0);, это работает. Почему он работает с 1.0, а не с 1?

Это тоже работает , когда я сначала приводил liste1 [0] к int, а затем к double. Подскажите, пожалуйста, почему?

Спасибо

Ответы [ 4 ]

4 голосов
/ 13 декабря 2011

ArrayList содержит объекты. Если вы добавите int, он будет «упакован» в объект и может быть «распакован» только до int - не double.

MSDN: бокс и распаковка

1 голос
/ 13 декабря 2011

Это подробно описано здесь , в превосходном блоге Эрика Липперта.

Короче говоря, это связано с тем, что оператор приведения C # означает разные вещи в разных контекстах. Лучше всего думать о int как о неявном операторе преобразования , позволяющем ему быть преобразованным в удвоение, но если во время компиляции тип не известен как int, это выиграет не беги. В конце концов, object не не имеет неявный (или явный) оператор преобразования, способный преобразовывать этот тип, и это то, что вы, по-видимому, пытаетесь сделать.

Теперь при желании можно было бы проделать еще некоторую работу за кулисами, чтобы определить, существует ли способ ее преобразования, но, поскольку это нетривиально, лучше всего оставить такой универсальный вспомогательный метод, как Convert.ToDouble(object).

1 голос
/ 13 декабря 2011

Потому что, если вы введете 1, это будет целочисленное значение, а не двойное. Целое число не может быть приведение к удвоению, это может быть только преобразование к удвоению, что является другой операцией, даже если в коде это выглядит одинаково. Поэтому, если вы хотите, чтобы он работал с целым числом 1, вам нужно привести его к int, а затем преобразовать в double:

(double)(int)liste1[0]

Или используйте Convert.ToDouble, который, вероятно, делает что-то подобное внутри:

((IConvertible)liste1[0]).ToDouble();
0 голосов
/ 13 декабря 2011

Индексатор ArrayList возвращает объект. C # не может привести от объекта к двойнику. Все это связано с преобразованием типов во время выполнения и боксом.

Это должно работать:

double num = (double)(int)liste1[0] +(double)liste1[2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...