gpt4 book ai didi

c# - 发现 op_Addition 或实现 Expression.Add 的方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:50 25 4
gpt4 key购买 nike

我正在使用 Antlr 和表达式树编写一种语言。

我已经为我的 Tree Parser 定义了一个标准的工厂方法,以便在生成加法时使用,它非常适合内置的整数类型,现在我将转向更通用的类型。

目前它非常天真,它只是这样做(进行中的 TDD 代码通常看起来很天真,对吧!?):

protected Expression GenerateAdd(Expression left, Expression right)
{
if (left.Type.Equals(right.Type))
return Expression.Add(left, right);
if (left.Type.IsValueType && right.Type.IsValueType)
Promote7_2_6_2(ref left, ref right);
return Expression.Add(left, right);
}

Promote7_2_6_2 生成的 Convert 表达式遵循 C# 规范 7.2.6.2 规定的整数提升规则(该语言类似于 C#,但也会与 JScript 交叉就像有其他全新的关键字一样)。

自然地,我继续测试字符串添加 - 即 "a"+ "b"; 我得到了错误:

System.InvalidOperationException:未为类型“System.String”和“System.String”定义二元运算符 Add。

很公平 - 我反射(reflect)了 System.String 并且确实没有定义运算符。在这样的测试方法中生成表达式树:

Expression<Func<string, string, string>> e = (s1, s2) => s1 + s2;

显示确实创建了一个 Add BinaryExpression,但实现方法设置为 string.Concat 方法之一。

我知道在某些情况下我将不得不考虑做这样的事情,但是有多少其他类型以这种方式定义加法?它只是 string 吗?

它是嵌入在 C# 编译器中的规则 - 还是存在某种可发现的元数据,我可以使用它来自动发现其他类型的此类方法?

提前致谢!

最佳答案

看来我在回答自己的问题方面做得很好!

抱歉,这个答案的格式可以更好,但我符合 HTC 的要求,它的键盘不支持所有符号!

似乎没有办法在运行时“发现”这些规则,宿主语言有责任决定如何实现诸如字符串添加之类的事情。 C# 适应加法中连续项的数量,调用最合适匹配的 .Concat 方法。

因此,例如,如果我希望我的语言支持添加未为其定义运算符的类实例,我可以简单地编写或找到一个静态方法来完成它(当然是正确的签名!)和然后硬连接语言以在这种情况下使用它。一个经典的例子是是否通过静态Array方法支持array1 + array2。

至于运算符的发现,Expression.Add 方法会处理它,但它不会自动执行任何转换,因此,就像我在问题中提到的整数/浮点提升方法一样,它再次启动根据语言的规则来确定在尝试构建表达式之前是否需要其他转换。

因此,最好先反射(reflect)运算符,看看是否为两种类型定义了一个,然后再考虑是否存在转换。

关于c# - 发现 op_Addition 或实现 Expression.Add 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com