QA@IT

C#でInterfaceをキャストする方法。

4554 PV

現在、C#を勉強しています。

あるオブジェクトがInterfaceを実装しているかどうか判定し、もし実装していた場合はInterfaceのメソッドを呼び出すという処理を書きたいと思っています。

そこでこのようにコードを書きました。

interface Tap{
    void touched();
}

public class UserInput{
       void run(){
                UserInput object;
        Tap tap = object as Tap;
        if(tap != null){
            tap.touched();
        }
       }
}

しかしこのコードは、コンパイル時にエラーになります。

エラー文は以下の通りです。

Connot covert type "UserInput" to "Tap" via a built-in conversion 

この場合、どのようにすれば、Tap型にキャストして、そのメソッドを呼び出せるのでしょうか?
ご回答いただけると幸いです。

回答

環境がわかりませんが、

予約語 objectを使用していること、変数が未初期化であることを除けば特にエラーにはなりません。
(.NET 3.5でビルド可能、実行も.NET4.51で確認)

interface Tap{
    void touched();
}

public class UserInput{
    void run(){
        UserInput obj = new UserInput();
        Tap tap = obj as Tap;
        if(tap != null){
            tap.touched();
        }
    }
}
編集 履歴 (0)
  • すいません、ここには書いてなかったのですが、Userinputにsealedが指定されていることに気がついていませんでした。ご回答、ありがとうございました。 -

この例では、コンパイラはUserInputクラスがTapを実装していないとすぐに分かるのでエラーになります。
無理やり判定するには、いったんSystem.Objectにキャストします。

ただ、objectというローカル変数名は避けた方が良いです。

var tap = ((System.Object)object) as Tap;

編集 履歴 (1)
  • markdownにやられました。太字の意味はないです。 -
  • 編集できますよ。 -
  • thx! -
  • お返事ありがとうございます。Objectという共通クラス(?)があったのですね。勉強になりました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。