Почему делает мой преобразователь, дающий недопустимую ошибку броска?

Вы можете сделать это, просто отображая фильмы и создавая реагирующий элемент, используя компонент класса в качестве первого параметра.

var moviesElements = movies.map(function(movie) {
  return React.createElement(Movie, {movie: movie});
});

Я сделал пример песочницы кода (также исправил некоторые опечатки и пропущенные параметры из кода, которым вы поделились)

7
задан AnthonyWJones 17 May 2009 в 13:57
поделиться

4 ответа

Вы пытаетесь преобразовать (не преобразовать) из double в int, что не сработает. Вам нужно выполнить неявное преобразование или использовать Convert.ToInt32 () - поскольку аргумент на самом деле имеет тип объекта, я думаю, вам понадобится последний, чтобы компилятор был доволен. Вам решать, хотите ли вы включить поставщик формата языка и региональных параметров.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return Convert.ToInt32(value);
}

Вы можете использовать оператор приведения, когда объект имеет одинаковую форму , то есть когда один объект является экземпляром тип, к которому вы переходите. Например, если класс Foo расширяет класс Bar, то вы можете привести объект типа Foo к типу Bar, потому что объект Foo имеет все методы и свойства, которые были бы у объекта Bar. Однако вы не могли привести объект типа Bar к типу Foo, потому что Foo изменяется (или может измениться, что касается компилятора) форма Bar путем добавления методов или свойств, которых нет у объекта Bar.

В вашем случае вы имеете дело с примитивными типами, которые имеют только общий объект интерфейс - между ними нет отношения наследования, за исключением того, что они оба являются производными от объекта. Однако существует неявное преобразование между ними. Вы можете назначить объект одного типа переменной другого, хотя вы можете потерять некоторую точность в значении.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Однако вы не можете преобразовать объект одного типа к другому. Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

путем добавления методов или свойств, которых нет у объекта Bar.

В вашем случае вы имеете дело с примитивными типами, которые разделяют только интерфейс объекта - между ними нет отношения наследования, за исключением того, что они оба являются производными от объекта. Однако существует неявное преобразование между ними. Вы можете назначить объект одного типа переменной другого, хотя вы можете потерять некоторую точность в значении.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Однако вы не можете преобразовать объект одного типа к другому. Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

путем добавления методов или свойств, которых нет у объекта Bar.

В вашем случае вы имеете дело с примитивными типами, которые разделяют только интерфейс объекта - между ними нет отношения наследования, за исключением того, что они оба являются производными от объекта. Однако существует неявное преобразование между ними. Вы можете назначить объект одного типа переменной другого, хотя вы можете потерять некоторую точность в значении.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Однако вы не можете преобразовать объект одного типа к другому. Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

t отношения наследования между ними, за исключением того, что они оба являются производными от объекта. Однако существует неявное преобразование между ними. Вы можете назначить объект одного типа переменной другого, хотя вы можете потерять некоторую точность в значении.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Однако вы не можете преобразовать объект одного типа к другому. Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

t отношения наследования между ними, за исключением того, что они оба являются производными от объекта. Однако существует неявное преобразование между ними. Вы можете назначить объект одного типа переменной другого, хотя вы можете потерять некоторую точность в значении.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Однако вы не можете преобразовать объект одного типа к другому. Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

Приведение подразумевает, что вы будете использовать объект, как если бы он был другого типа. В этом случае формы различаются, и это невозможно.

8
ответ дан 6 December 2019 в 19:41
поделиться

Проблема в том, что вы пытаетесь одновременно выполнить распаковку и преобразование. Это не удастся. Вы должны сначала распаковать, а затем привести к соответствующему типу.

return (int)(double)value;

Эрик Липперт Недавно написал хорошую статью о том, почему именно это необходимо. Стоит прочитать

3
ответ дан 6 December 2019 в 19:41
поделиться

Значение double заключено внутри объекта, и единственный способ получить его - распаковать его как double . После этого вы можете преобразовать его в int .

return (int)(double)value;

Вы также можете использовать метод Convert.ToInt32 (object) (как предложил tvanfosson), который преобразует объект в IConvertible и вызовите его виртуальный метод ToInt32 , который, в свою очередь, вызовет метод Convert.ToInt32 (double) . Это, конечно, немного больше накладных расходов.

1
ответ дан 6 December 2019 в 19:41
поделиться

Вы хотите преобразовать, но выполняете преобразование из double в int. Попробуйте следующее:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
1
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: