gpt4 book ai didi

c# - 在 PowerShell 中使用带有重载算术运算符的自定义 .NET 类

转载 作者:太空狗 更新时间:2023-10-29 23:40:14 25 4
gpt4 key购买 nike

我在 C# 中定义了一个类(称之为 A 类)并为其重载了一些算术运算符。让我们关注加法运算符(尽管我希望其他运算符的行为类似)。我已经设置了 A 类,以便我可以向它添加一个标量(即单个 Double 值),我可以将它添加到一个标量,或者我可以将 A 的两个实例加在一起。

所以在 C# 中,我让“+”运算符重载了三个不同的签名。明确的签名是:

  • 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 没有看到采用 A 类的 Double 运算符,并且 A 类无法转换为 Double。
  • a1 + d # 按预期工作
  • a1 + a2 # 失败。抛出“未设置对象引用...”错误,因为结果为 NULL。
  • a1 + a3 # 按预期工作。

感谢您指引我正确的方向!

最佳答案

出于好奇,我对此进行了测试。我创建了一个这样的类:

namespace ClassLibrary1
{
public class Class1
{
public static string operator +(Class1 class1, double d)
{
return "a";
}

public static string operator +(double d, Class1 class1)
{
return "b";
}

public static string operator +(Class1 class1, Class1 class12)
{
return "c";
}
}
}

我能够调用以 Class1 作为第一个参数的两个重载,但无法调用以 double 作为第一个参数的重载。我不知道为什么你不能调用 A + A 的重载,也许是出于不同的原因而不是调度正确的运算符重载?

$a = New-Object ClassLibrary1.Class1
($a + 0) -eq 'a' # Was True
($a + $a) -eq 'c' # Was True

调用重载:

([double]0 + $a) -eq 'b'

报错:

Cannot convert the "ClassLibrary1.Class1" value of type "ClassLibrary1.Class1" to type "System.Double".

所以我假设您可以调用不同的运算符重载,只要第一个参数是运算符重载的类型即可?

关于c# - 在 PowerShell 中使用带有重载算术运算符的自定义 .NET 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963766/

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