2012-02-15 14 views
3

私の質問のコンテキストは、MonoDroidを使用してWCFサービスを使用するプログラムを作成することです。私はC#でSOAPについてC#ライブラリのいくつかを欲しかったので、MonoDroidは当然の選択でした。テンプレートパラメータのC#void同等

テンプレートパラメータとしてvoidをAsyncTaskに渡そうとしています。

Xamarin(MonoDroidの開発者が)AsyncTaskはまだ十分とは言えないし、ここで見つけることができますになりますドキュメント:http://docs.mono-android.net/?link=C%3aAndroid.OS.AsyncTask私がする必要がどのような

が、私はこの

のように定義されてAsyncTaskをJavaで実現
 public class SoapRequestTask extends AsyncTask<Void, Void, String> 

voidテンプレートパラメータに相当するC#とは何ですか?

+0

http://stackoverflow.com/questions/4000008/using-void-pointers-as-template-and-function-parameters-in-c-sharp だから、単に代わりにボイド足りるのオブジェクトを供給しますか? – xtopher

+0

Android用のMonoは、汎用パラメータを一切使用しないAsyncTaskを提供します。 (あなたがそこからインポートされたJavaのドキュメントは誤解を招いています)。 'AsyncTask'(型パラメータなし)から継承し、' DoInBackground(params Java.Lang.Object []) 'をオーバーライドします。 – jonp

答えて

3

I関心のある人のためにこれに対する答えを実際に見つけた:

private class SoapTask : AsyncTask{} 

これはJavaのAsyncTaskと同じように動作しますが、パラメータはすべてJava.Lang.Objectsです(ただしパラメータの型はJava.Lang.Objects []です)。したがって、必要に応じてパラメータを設定できます。体。

0

C#では、ジェネリック型パラメータとしてvoid(a.k.a. System.Void)を使用できません。 .Netライブラリは、TaskTask<T>のような複数の "オーバーロード"タイプを持つことでこれを解決します。

しかし私はMonoDroidを知らないので、それに特有の解決策があるかもしれません。ドキュメントには、特別なタイプのJava.Lang.Voidがあります(通常の.net voidでは使用できません)。

0

Voidの標準に相当するものはC#で存在しません。型は存在しますが、汎用型引数としては使用できません。

最も近い例は、値が無関係なスロットのプレースホルダとしてF#のUnitの使用です。それはで複製することは簡単ですC#

public sealed class Unit { 
    public static Unit Value { get { return null; } } 
    public static implicit operator Unit(object source) { 
    return Value; 
    } 
} 
あなたが実際にすべてのvoid型を使用しないよう それは、値のために使用することができる

あなたは私のために約

public class SoapRequestTask : AsyncTask<Unit, Unit, String> { 
    ... 
} 
1

を気にしない、それが見えますこの例では、「すべてのタイプはここに移動できます」という意味で使用されています。 AsyncTaskの「ジェネリック型段落」を読むことは、3つの型がパラメータ型、進捗型および結果型を表すことを意味します。

public class MyStringTask extends AsyncTask<String, Integer, Long> { 
... 
} 

あなたはexecuteメソッドにパラメータとして渡すオブジェクトの型が進行は次のように通知されることになる文字列

var myStringTask = new MyStringTask(); 
myStringTask.execute("the first string", "the second string"); 

次のようになります。あなたがクラスを作成した場合ので、例えば、として宣言整数値と結果値はLongとして供給されます。(上記の例を使用して)型パラメータのための 'T' の構文を使用して、実施

public abstract class AsyncTask<TParam, TProgress, TResult> 

:C#ので

、あなたは通常通り、これは宣言見るでしょう

public class MyStringTask : AsyncTask<string, int, long> 
{ 
    ... 
}