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 に)。オーバーロードの解決により、最初のパラメーターで直接の型の一致が検出され、2 番目のパラメーターが強制される可能性があり、どのオーバーロードも型と完全に一致しないことがわかります。そうは言っても、私はたまたまあなたに同意します。メンバーのオーバーロードの解決により、PowerShell がさらに改善されることを期待しています。この場合、型の強制よりも型の互換性を優先する必要があります。もちろん、オブジェクト参照に bool を配置するにはボックス化が必要なため、おそらくその特定のオーバーロードのスコアが低下しました。

この問題をhttp://connect.microsoft.comの PowerShell チームに送信することを検討してください。

于 2012-10-26T16:09:48.747 に答える