为了账号安全,请及时绑定邮箱和手机立即绑定

DynamicExpression.Parse 在多大程度上识别 C# 符号?

DynamicExpression.Parse 在多大程度上识别 C# 符号?

C#
呼啦一阵风 2022-01-09 09:59:54
给定一个字符串:“5.2m*5.7m”,返回类型为十进制;并打电话`System.Linq.Dynamic.DynamicExpression.Parse(returnType, expression);`将给出关于位置字符“m”的语法错误;经过一些测试,同样适用于“d”;为了提供一些上下文,使用 m 的原因是为了避免另一个错误,即 double*decimal 的乘法,因为它会将浮点值默认解释为 double。我的问题是:为什么会发生这种情况?解决双 * 十进制问题的最佳方案是什么?通过(十进制)5.7 转换我知道的值是十进制还是使用 Convert.ToDecimal(5.7)?parse() 到底知道多少?(我没有找到有关 msdn 等的文档)
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我的问题是:为什么会发生这种情况?

发生这种情况是因为DynamicExpression使用了自定义构建的表达式解析器。它被制作成类似于 C#,但它不是 C#。并非所有在 C# 中有效的东西都能正常工作,而且在 C# 中有效的一些东西的工作方式也不同。

解决双 * 十进制问题的最佳方案是什么?通过(十进制)5.7 转换我知道是十进制的值还是使用 Convert.ToDecimal(5.7)?

投射,但不使用这种语法。使用的语法是type(expr),不是(type)expr,见下文。

parse() 到底知道多少?(我没有在 msdn 等上找到文档)

原始文档的副本似乎可在http://ak-dynamic-linq.azurewebsites.net/GettingStarted 获得。我尚未验证整个文档是否未经修改,但我已将以下内容与原始文档进行了比较。

去引用:

表达式语言允许使用语法显式转换type(expr)type"string",其中类型是类型名称任选地接着?EXPR是一个表达式或是字符串文字。此语法可用于执行以下转换:

  • 提供的两种类型之间Type.IsAssignableFrom在一个或两个方向上都是正确的。

  • 在提供的两种类型之间,一种或两种是接口类型。

  • 介于任何值类型的可空和不可空形式之间。

  • 在字符串和任何具有静态 TryParse 方法的类型之间。

  • 属于包括以下各项的集合中的任何两种类型之间SByteByteInt16UInt16Int32UInt32Int64UInt64DecimalSingleDoubleChar,任何枚举类型,以及所述可空这些类型的形式。


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信