PowerShell方法重载解决bug?

时间:2012-10-26 09:21:48

标签: powershell

似乎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))

1 个答案:

答案 0 :(得分:2)

PowerShell允许比C#更多的类型强制。例如,如果需要,PowerShell会将DateTime强制转换为字符串(或者bool的int或bool的字符串)。我怀疑重载决议是在第一个参数上找到直接类型匹配,然后注意第二个参数可以被强制,并且没有任何重载与类型完全匹配。那就是说,我碰巧同意你的看法。我希望看到PowerShell的成员重载分辨率变得更好。在这种情况下,我会说类型兼容性应该优先于类型强制。当然,将bool放在一个对象引用中需要装箱,所以也许这会打倒那个特定过载的得分。

请考虑在http://connect.microsoft.com上向PowerShell小组提交此问题。