2

たとえば、オプションのパラメータを含むClassAメソッドがあります。Fooしたがって、メソッドに示すように使用できますDoFoo

public class ClassA
{
    public ClassA() { }

    public void Foo(bool flag = true)
    {
    }

    public void DoFoo()
    {
        Foo(); // == Foo(true);
    }
}

一度それを別のクラスに渡す必要がありましたClassB。最初にそれをとして渡そうとしましActionたが、署名は確かに一致しませんでした。次に、それをとして渡しましAction<string>た。署名は一致しましたが、のパラメーターはClassBオプションではなくなりました。しかし、私はそれをオプションにしたいので、デリゲートを宣言することを思いつきました。だから、それはうまくいきました。

public delegate void FooMethod(bool flag = true);

public class ClassB
{
    Action<bool> Foo1;
    FooMethod Foo2;

    public ClassB(Action<bool> _Foo1, FooMethod _Foo2)
    {
        Foo1 = _Foo1;
        Foo2 = _Foo2;
    }

    public void DoFoo()
    {
        Foo1(true);
        Foo2(); // == Foo2(true);
    }

したがって、問題は、デリゲートを明示的に宣言せずに、オプションのパラメーターを引数として持つメソッドを渡して、そのパラメーターのオプションの品質を維持できるかどうかです。

4

1 に答える 1

4

したがって、問題は、デリゲートを明示的に宣言せずに、オプションのパラメーターを持つメソッドを引数として渡して、そのパラメーターのオプションの品質を維持できるかどうかです。

いいえ。「オプション」はメソッドのシグネチャの一部であり、コンパイラがデフォルト値を提供するためにコンパイル時に知る必要があります。オプションのパラメーターを持たないデリゲート型を使用している場合、十分な引数なしでそれを呼び出そうとすると、コンパイラーは何を意味しますか?

最も簡単なアプローチは、おそらくそれをラップすることです。

CallMethod(() => Foo()); // Compiler will use default within the lambda.
...
public void Foo(bool x = true) { ... }

public void CallMethod(Action action) { ... }
于 2012-10-04T13:59:21.087 に答える