C#与模板参数等效的void

时间:2012-02-15 20:38:57

标签: c# android xamarin.android android-asynctask

我的问题的背景是我正在使用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#等价物是什么?

4 个答案:

答案 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库通过使用多个“重载”类型来解决此问题,例如TaskTask<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> { 
  ...
}