1
31
在这个版本中有两个新的“特殊”操作符,(?)和(?)&…它们没有定义,但是可以用于重载,因此您可以自己定义它们。特殊的位是它们如何处理第二个操作数:它们要求它是有效的F标识符,但将其传递给函数,将运算符实现为字符串。换言之:
减至:
还有:
减至:
这些运算符的一个非常简单的定义可以是:
注意,由于gettor的返回类型是泛型的,所以在大多数情况下,您必须在使用站点指定它,即:
尽管你仍然可以连锁反应(?)(从(?)的第一个参数开始)也是通用的):
另一个更有趣的实现是重新使用VB提供的callbyname方法:
这样做的好处是,它可以正确处理属性和字段,使用IDispatch COM对象等。 |
2
4
听起来像“?”运算符与动态语言运行时(DLR)相关。也就是说,当您希望在运行时而不是在编译时绑定到对象成员(方法、属性)时,可以使用它。 这很有趣,因为我希望这也是动态成员调用在C中的工作方式。唉,C通过“伪”类型(“动态”IIRC)公开了这个功能。在我看来,这使得代码不那么清晰(因为您必须跟踪变量声明以了解调用是早绑定还是晚绑定)。 我不知道确切的语法,但是如果我不得不猜测的话,它要么替换要么增加“.”(dot)操作符。如:
或者:
|
3
1
有一个模块 FSharp.Interop.Dynamic 在使用DLR实现动态运算符的nuget上。
它是开源的,Apache许可证,您可以查看 implementation 包括单元测试 example cases . |