0

私はc#アプリケーションを持っています。アプリケーションの実行の2つの異なるステップでアプリケーションの状態を表す2つの異なるクラス(Step1.StateおよびStep2.State )( IMDP.IStateと呼ばれる同じインターフェイスを実装しています)があります。アプリケーションの状態を更新するためのオーバーロードされたメソッドが 2 つあります。

メソッドの 1 つに次のコードがあります。

Step1.State s1s = null;
Step2.State s2s = null;

次に、そのタイプに応じて現在の状態をキャストしています。currentStateは、パラメーターとして受け取る実装済みインターフェースのインスタンスです。まず、動的型に格納しています。

  //currentState is instance of IMDP.IState interface which is 
  //implemented by the two states

    dynamic curState=currentState;  

            if(curState is Step1.State)
            {
                s1s = (Step1.State)currentState;
                curState = s1s;

            }
            else if (curState is Step2.State)
            {
                s2as = (Step2.State)currentState;
                curState = s2s;

            }

次に、オーバーロードされたメソッドを同じメソッド内で呼び出しています。

  currentState = myAgent.UserStateUpdate(prevAction, curState, e.Result);

UserStateUpdateメソッドには 2 つのオーバーロードされたバージョンがあります。1 つ目はStep1.Stateを取得し、2 つ目はStep2.Stateを差別化パラメーターとして取得します。次のように。

IMDP.IState UserStateUpdate(IMDP.IAction act, Step1.State st, RecogResult rr)
IMDP.IState UserStateUpdate(Step2.Abuse.Action act, Step2.State st, RecogResult rr)

アプリケーションはStep1.Stateの正しいメソッドを呼び出しますが、アプリケーションが状態表現にStep2.Stateを使用する Step2 に移動するとき。次の例外をスローします。オーバーロードされたメソッドを呼び出す前にcurState (動的に型指定) に格納されているものを確認すると、Step2.Stateと型指定された正しい状態が表示されることに注意してください。

" 'BI4A.Agent.Agent.UserStateUpdate(BI4A.IMDP.IAction, BI4A.Step1.State, System.Speech.Recognition.RecognitionResult)' に最適なオーバーロードされたメソッドの一致には、無効な引数が含まれています"

これは基本的に、システムが Step2.State の代わりに Step1.State を受け入れるオーバーロードされたメソッドを呼び出そうとしていることを示しています。正しいメソッドを呼び出す方法がわかりませんでした。助けてくれてありがとう。

4

1 に答える 1