似乎PowerShell方法的重载解析系统与C#
不一致让我们进行比较
C#
class Program
{
static void Main(string[] args)
{
MyClass.MyMethod(false, DateTime.Now);
}
}
public static class MyClass
{
public static void MyMethod(object obj, DateTime dateTime)
{
Console.WriteLine("MyClass.MyMethod(object obj, DateTime dateTime)");
}
public static void MyMethod(bool b, string str)
{
Console.WriteLine("MyClass.MyMethod(bool b, string str)");
}
}
VS
PowerShell的
Add-Type `
@"
using System;
public static class MyClass
{
public static void MyMethod(object obj, DateTime dateTime)
{
Console.WriteLine("MyClass.MyMethod(object obj, DateTime dateTime)");
}
public static void MyMethod(bool b, string str)
{
Console.WriteLine("MyClass.MyMethod(bool b, string str)");
}
}
"@
[MyClass]::MyMethod($false, [DateTime]::Now)
C#将返回
MyClass.MyMethod(object obj, DateTime dateTime)
我们的预期
但PowerShell将返回
MyClass.MyMethod(bool b, string str)
如果我们想要调用正确的方法,我们必须更明确地调用重载,我们要调用
[MyClass]::MyMethod([object] $false, [DateTime]::Now)
我认为这是PowerShell中的一个错误,而不是一个功能
上面的代码在PowerShell 3中进行了测试
在PowerShell 2中情况更糟。我找不到一种方法来调用正确的重载
即使这个也不起作用
[MyClass]::MyMethod([object] $false, [DateTime] ([DateTime]::Now))
答案 0 :(得分:2)
PowerShell允许比C#更多的类型强制。例如,如果需要,PowerShell会将DateTime强制转换为字符串(或者bool的int或bool的字符串)。我怀疑重载决议是在第一个参数上找到直接类型匹配,然后注意第二个参数可以被强制,并且没有任何重载与类型完全匹配。那就是说,我碰巧同意你的看法。我希望看到PowerShell的成员重载分辨率变得更好。在这种情况下,我会说类型兼容性应该优先于类型强制。当然,将bool放在一个对象引用中需要装箱,所以也许这会打倒那个特定过载的得分。
请考虑在http://connect.microsoft.com上向PowerShell小组提交此问题。