我的问题的背景是我正在使用MonoDroid编写程序来使用WCF服务。我想要一些关于C#中SOAP的C#库,所以MonoDroid是一个明显的选择。
我试图将void作为模板参数传递给AsyncTask。
Xamarin(MonoDroid的开发人员)在AsyncTask上提供的文档还有很多不足之处,可以在这里找到:http://docs.mono-android.net/?link=C%3aAndroid.OS.AsyncTask
我需要做什么,我在Java中完成了像这样定义的AsyncTask
public class SoapRequestTask extends AsyncTask<Void, Void, String>
void模板参数的C#等价物是什么?
答案 0 :(得分:3)
我确实为感兴趣的人找到了答案:
语法是
private class SoapTask : AsyncTask{}
它就像java中的AsyncTask一样,但参数都是Java.Lang.Objects(参数类型是Java.Lang.Objects []除外),所以你可以根据需要设置它们。体。
答案 1 :(得分:1)
对我来说,看起来你实际上根本没有使用void类型,它只是在例子中用来表示“任何类型都可以在这里”。读取AsyncTask的“泛型类型段落”意味着3种类型表示参数类型,进度类型和结果类型。例如,如果您创建了一个声明为:
的类public class MyStringTask extends AsyncTask<String, Integer, Long> {
...
}
作为参数传递给execute方法的对象类型将是一个字符串
var myStringTask = new MyStringTask();
myStringTask.execute("the first string", "the second string");
进度将作为Integer值通知,结果值将以Long形式提供。
在C#中,您通常会将其声明为:
public abstract class AsyncTask<TParam, TProgress, TResult>
对类型参数使用'T'语法并实现(使用上面的示例):
public class MyStringTask : AsyncTask<string, int, long>
{
...
}
答案 2 :(得分:0)
在C#中,您无法使用void
(a.k.a。System.Void
)作为泛型类型参数。 .Net库通过使用多个“重载”类型来解决此问题,例如Task
和Task<T>
。
但我不知道MonoDroid,所以可能会有一些特定的解决方案。该文档似乎表明可以使用特殊类型Java.Lang.Void
(而不是此处不能使用的普通.Net void
)。
答案 3 :(得分:0)
C#中没有标准等效的Void
。该类型确实存在,但它不能作为泛型类型参数使用。
最接近的例子是F#使用Unit
作为插槽的占位符,其价值无趣。它很容易在C#中复制
public sealed class Unit {
public static Unit Value { get { return null; } }
public static implicit operator Unit(object source) {
return Value;
}
}
然后可以将其用于您不关心的值
public class SoapRequestTask : AsyncTask<Unit, Unit, String> {
...
}