Приведение объекта из JSON к плавающей - PullRequest
0 голосов
/ 06 сентября 2018

Я столкнулся с очень странной вещью при создании файла настроек JSON в проекте. globalSettings - это контейнер, в котором хранится множество настроек.

В свойстве PreHeight я сохраняю новое значение для globalSetting (эти настройки будут сохранены в файле json при выходе из приложения). Я даже явно приводил «значение» для ясности (на самом деле не требуется).

globalSettings["PreHeight"] = (float)value;

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

   PreHeight = (float)globalSettings["PreHeight"];

К моему удивлению, это исключение не может быть использовано. Затем я просто изменил строку, чтобы использовать нейтральный для языка подход Convert.ToSingle (). На заднем плане он должен делать точно такой же тип приведения. К моему удивлению строка кода не выдается при использовании подхода Convert.ToSingle ().

   PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);

Может кто-нибудь объяснить это странное поведение?

Мне хорошо известно, что JSON сохраняет в простейшем типе данных, поэтому 0 рассматривается как целое число, но с какой стати возникнет проблема приведения его обратно в число с плавающей точкой?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Если значение, возвращаемое индексированием globalSettings, является строкой, то приведение string к float невозможно. Convert.ToSingle использует Single.Parse под капотом. Вот почему это работает, и это то, что вы должны использовать:

using System;

PreHeight = Single.Parse(globalSettings["PreHeight"]);
// or
PreHeight = float.Parse(globalSettings["PreHeight"]);
0 голосов
/ 06 сентября 2018

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

Так как это не строка, Float. Сбой разбора.

Поскольку это объект, и CLR предполагает, что он является плавающей точкой двойной точности (по умолчанию), оператор Typecast не может преобразовать его из-за возможной потери точности. Вот так оператор typecast не работает. Альтернативный код может быть,

 PreHeight = (float) ((double)(globalSettings["PreHeight"]);

Convert.ToSingle - парень, предназначенный для преобразования Double Precision в Single Precision, и он хорошо работает.

 PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);

Это единственное право обрабатывать это преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...