Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377

Как приводить из dynamic к decimal

31.08.2021, 00:15. Показов 2088. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Такой вот код написал, и узнал, что при использовании Convert методов, возвращаемое значение видит только родные методы для своего типа, а расширители нет. Можно-ли как-то пофиксить? если использовать каст "(decimal)value", то можно получить NPE, а этого нужно избегать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    public static class DecExt
    {
        public static decimal SomeFoo(this decimal source)
        {
            decimal result;
            
            if (source > 0)
            {
                result = 0;
            }
            else
            {
                result = -1;
            }
 
            return result;
        }
 
    }
 
    class Program
    {
        static void Main()
        {
            decimal d = 32.2M;
 
            dynamic json = new
            {
                a = d
            };
 
            decimal a1 = Convert.ToDecimal(json.a).SomeFoo();
            Console.WriteLine(a1);
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2021, 00:15
Ответы с готовыми решениями:

Что выгодней: (decimal,decimal) или decimal[]
Что выгоднее для памяти и производительности: создание кортежей (decimal,decimal) или массивов decimal? Предполагается большое количество. ...

Не работает запрос с одинаковыми типами данных c# decimal, SQL Server Decimal(18,2)
Здравствуйте, не понимаю почему не проходит запрос на бд, с одинаковыми типами данныхDecimal(18,2) число 1000,00 проходит, а 1000,35...

как приводить тип к другому типу?
Хай всем! В паскале полный ноль. Неплохо знаю VB, Си, пхп, яву. Придурацкий хелп в DElphi должон я сказать! Никак не могу разобраться,...

5
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.08.2021, 02:13
C#
1
2
decimal a1 = Convert.ToDecimal(json.a);
a1 = a1.SomeFoo();
2
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
31.08.2021, 02:49  [ТС]
kolorotur, это особенности методов To...()?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.08.2021, 09:11
Лучший ответ Сообщение было отмечено cinekst_207 как решение

Решение

cinekst_207, нет, это особенности методов-расширений: поиск подходящего класса с методом производится по определенным правилам, которые невозможно применить во время выполнения ввиду отсутствия в скомпилированной сборке необходимой информации.
Из-за этого расширения не работают с динамиками.
1
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
31.08.2021, 10:55  [ТС]
kolorotur, А почему через каст все работает? :
C#
1
((decimal)value).SomeFoo(); // 0
Добавлено через 1 минуту
Просто я думал, что т.к. Convert.ToDecimal() возвращает decimal, то это тоже должно было сработать, а почему-то нет
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.08.2021, 11:31
Цитата Сообщение от cinekst_207 Посмотреть сообщение
А почему через каст все работает?
Потому что вы явно определяете тип выражения, следовательно компилятору есть с чем работать.

Цитата Сообщение от cinekst_207 Посмотреть сообщение
я думал, что т.к. Convert.ToDecimal() возвращает decimal, то это тоже должно было сработать, а почему-то нет
dynamic означает, грубо говоря, "отложить компиляцию этого выражения до времени выполнения".
Вы вызываете Convert.ToDecimal, передавая туда динамическое выражение json.a.
Чтобы определить какую перегрузку ToDecimal вызывать, компилятор должен знать тип аргумента. Поскольку аргумент — dynamic, постольку определение этого типа и как следствие — определение перегрузки, откладываются до времени выполнения. Ну а поскольку на стадии компиляции неизвестно какая перегрузка ToDecimal будет вызвана, постольку неизвестно и какой будет тип возвращаемого значения. Из чего следует неизвестность к какому типу относится последующий вызов SomeFoo.
Когда программа уже работает, на этой строчке запускается "кастрированная" версия компилятора, которая определеяет фактический тип аргумента и находит нужную перегрузку, но последующий вызов SomeFoo уже не может определить как метод-расширение из-за отсутствия в рантайме необходимой информации.
Когда вы делаете явный каст к определенному типу, то выражение уже не является динамическим и все типы можно разрулить на стадии компиляции.
Если во время выполнения окажется, что value на самом деле не decimal, то весь последующий анализ, основанный на этом типе, становится недействительным и среда завалит приложение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.08.2021, 11:31
Помогаю со студенческими работами здесь

Как приводить к другим типам данных?
Set Rst = Db.OpenRecordset('SELECT * FROM ДВО WHERE Код ='& cdbl(List(i))) List(i)-строковый массив Код - поле счётчик При...

Написать функции для преобразования IP адреса из dot-decimal нотации в int и из int в dot-decimal нотацию
IP-адрес - это четверка a.b.c.d, где a, b, c, d целые числа из интервала . Требуется написать функции encode и decode: unsigned int...

Как работает decimal
from decimal import * getcontext().prec = 7 print(Decimal(256356754).sqrt()) Что импортируется вместо звездочки и как можно узнать,...

Ошибка Cannot convert from 'ref decimal' to 'ref decimal?
Здравствуйте подскажите пожалуйста почему в строке this.allTuriPoCeneTableAdapter.FillBy(this.turfirmaDataSet.AllTuriPoCene, ref Cena); ...

Как перевести из char в decimal?
Kak perevesti is char v decimal?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru