3

看来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)");
    }
}

对比

电源外壳

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))
4

1 回答 1

2

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

考虑在http://connect.microsoft.com上将此问题提交给 PowerShell 团队。

于 2012-10-26T16:09:48.747 回答