【发布时间】:2012-10-09 10:46:54
【问题描述】:
我在 C# 中定义了一个类(称为 A 类)并为它重载了一些算术运算符。让我们关注加法运算符(尽管我希望其他运算符的行为类似)。我已经设置了 A 类,这样我就可以向它添加一个标量(即单个 Double 值),我可以将它添加到一个标量,或者我可以将 A 的两个实例加在一起。
所以在 C# 中,“+”运算符重载了三个不同的签名。明确的签名是:
- A + 双
- 双+A
- A + A
当我在 PowerShell 中使用该类时,它只识别三个重载之一。因此在 PowerShell 中我可以执行 A + Double 但其他两个表达式会导致错误。
当我在 A 的实例上使用 Get-Member Cmdlet 时,它看起来好像“看到”了所有三个重载,但只尊重列表中的第一个重载。
我怀疑这是设计使然。我喜欢 PowerShell,但它与 C# 非常不同,我希望它只允许重载运算符的一个签名(基于我到目前为止所了解的内容),并且表达式的左侧成员确定添加的类型履行。谁能确认一下?
我的工作是在 C# 中为该类编写一些更详细的静态方法(如“AddScalar”和“AddA”方法)。在 PowerShell 中,我会调用这些命名方法,而不是使用“+”运算符。这应该可以正常工作,但最好让 PowerShell 根据添加的内容为“+”使用适当的定义。
是否有人成功使用具有不同签名的重载类运算符,或者这种行为会破坏基本的 PowerShell 设计目标?
更新: Dugas 搞定了。但我确实在此过程中学到了其他东西,并想在这里发布。
当我为 A 类定义加法时,我定义了它,以便添加 A 类的两个实例将产生 A 类的新实例或产生 NULL。 (这对我来说是糟糕的设计,因为加法确实应该关闭。换句话说,理想情况下,加法应该总是产生可以被另一个加法运算符操作的东西。)在 C# 中这不是问题,因为我从来没有添加更多一次超过两个对象,并在我检查结果时检查 NULL。
如果操作的结果为 NULL,PowerShell 会为 op_Addition 运算符抛出“未设置对象引用...”错误,而不是返回 NULL。当 PowerShell 尝试使用错误的重载运算符并且在执行类型转换时遇到问题时,我假设正在创建 NULL 引用,从而误解了这个错误。
我为对象重新运行了 A + A 案例,这些对象在求和时会返回 A 类的另一个对象实例,并且一切正常。
总而言之,如果 a1、a2 和 a3 都是 A 类的实例并且 d 是 Double 并且如果 a1 + a2 = NULL 并且 a1 + a3 = aX(其中 aX 是 A 类的新实例),那么.. .
- d + a1 # 失败,因为 PowerShell 没有看到使用 Class A 的 Double 运算符,并且 Class A 无法转换为 Double。
- a1 + d # 按预期工作
- a1 + a2 # 失败。由于结果为 NULL,因此引发“未设置对象引用 ...”错误。
- a1 + a3 # 按预期工作。
感谢您引导我朝着正确的方向前进!
【问题讨论】:
-
调用正确的操作符方法是 C# 编译器的一个特性,所以我一点也不奇怪,这在 PowerShell 中不能很好地工作。
-
我很确定这是在 CLS 中标准化的。
标签: c# .net powershell operators