3

C#では、クラス関数(静的ではない)を関数のパラメータとして渡すことは可能ですか?

「クラス/インスタンス」関数をパラメーターとして渡しているため、何らかの理由で関数のダウンロード内でコンパイル エラーが発生します。

例えば:

public class MyPlane {
   Texture texture;

   virtual public void OnDownloadPlaneCallBack(WWW www) {
      // perform custom actions when/if file downloads correctly
      texture = www.texture;
   }

   virtual public void download() {
       Downloader.download("www.blah.com", OnDownloadPlaneCallBack);  // this gives a compile error? 
   }
}

public class Downloader {

    public static IEnumerator download(string url, Delegate callback) {
        WWW www = new WWW(url); 

        while(!www.isDone)
            yield return www;

         if (www.isDone) {
            callback.DynamicInvoke(www);
         }
    }
}
4

2 に答える 2

3

もちろん、インスタンス メソッドからデリゲートを構築できます。これは非常に強力な機能です。あなたが目にしている問題は、メソッド グループを使用してデリゲートを作成する特定の構文に関係しています。

メソッド グループ (「ネイキッド」メソッド名からデリゲートを構築するための正式な名前) は「型なし」Delegateのパラメーターとして渡すことができないため、コンパイル エラーが発生します。

メソッドのシグネチャdownloadを acceptAction<WWW>に変更すると、コードは正しくコンパイルされます。次のように、メソッド グループを明示的にキャストすることもできます。

Downloader.download("www.blah.com", (Action<WWW>)OnDownloadPlaneCallBack);
于 2012-07-23T03:00:38.327 に答える
1

はい。

public string CanReceiveFunction(Func<int, string> func) {
    if (func != null) return func(5);
}

public string CanConvertIntToString(int a) {
    return "here is the result: " + a;
}

public void Main() {
    var result = CanReceiveFunction(CanConvertIntToString);
    Console.WriteLine(result);
}
于 2012-07-23T03:03:08.727 に答える