0

ジェネリックに関してできることとできないことを確認するためにいじり回していました。私はこのような状況にあり、コンパイラーはあいまいなメソッド呼び出しに関してエラーをスローする必要がありますが、完全に正常にコンパイルされます。何故ですか?

public interface IFunctionStrategy<T>
{
    T Strategy(params object[] parameters);
}

public class FunctionStrategyBase<T> : IFunctionStrategy<T>
{
    public virtual T Strategy(params object[] parameters)
    {
        MethodBase current = MethodBase.GetCurrentMethod();
        return (T)GetType().InvokeMember(current.Name, BindingFlags.InvokeMethod | BindingFlags.Public, Type.DefaultBinder, this, parameters);
    }

}

public class ConnectionConnect : FunctionStrategyBase<int>
{
    public int Strategy(int i)
    {
        return i;
    }
}
4

4 に答える 4

4

あいまいさはありません。あなたがコメントで言ったように、署名は異なります。のコンテキスト内にConnectionConnect

Strategy(int i)

そして

Strategy(params object[] parameters)から継承されますFunctionStrategyBase

これは完全に許容できるオーバーロードです。実行時に何が起こっても、これらの関数の仕組みを知らなかった場合に発生する可能性のある奇妙な動作に関係なく、コンパイラはこれに関して厳密な問題を認識しません。

実行時に呼び出す場合、プログラムは有効な暗黙的キャストを行うことができる署名をチェックする前に、最も近い一致する signatureを使用します。単一の int を に渡すとStrategy、そのStrategy(int i)メソッドが使用されます。これがない場合は、暗黙的に int をボックスStrategy(params object[] parameters)化し、言語の機能として に渡します。

于 2014-03-19T21:15:04.207 に答える
1

コードは、リフレクションを使用して行われる 1 つのメソッド呼び出しのみを示しています。

したがって、コンパイル時に解決を行うことはできません。そのため、コードは問題なくコンパイルされます。

また、各クラスにはメソッドが 1 つしかないため、あいまいさはありません。

于 2014-03-19T21:07:07.953 に答える
0

このコメントを正しく解釈すれば

戦略、両方の戦略は署名が異なります。param object[] 引数と int i をどのように区別できますか?

thenparam object[]とは、任意の種類の可変数のパラメーターを指定するint iため、区別する必要はありません。param object[]したがって、int iが宣言さiれると、 は にボックス化され、object単一項目配列として関数に渡されます。しかし、コメントを正しく解釈しているかどうかはわかりません。

于 2014-03-19T21:10:35.253 に答える