C # Void эквивалент для параметров шаблона - PullRequest
3 голосов
/ 16 февраля 2012

В контексте моего вопроса я использую 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>

Что такое эквивалент C # параметра шаблона void?

Ответы [ 4 ]

3 голосов
/ 17 февраля 2012

Я действительно нашел ответ на этот вопрос для всех, кто интересуется:

Синтаксис

    private class SoapTask : AsyncTask{}

И он работает так же, как AsyncTask в Java, но все параметры являются объектами Java.Lang.Object (за исключением того, что тип параметров является Java.Lang.Objects []), поэтому вы можете просто установить их по мере необходимости в корпус.

1 голос
/ 16 февраля 2012

Мне кажется, что вы на самом деле вообще не используете тип void, это просто используется в примере для обозначения "любой тип может пойти сюда". Чтение «параграфа универсальных типов» в AsyncTask подразумевает, что эти 3 типа должны представлять тип параметра, тип прогресса и тип результата. так, например, если вы создали класс, объявленный как:

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

Тип объекта, который вы передаете в качестве параметра методу execute, будет строкой

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

Ход выполнения будет сообщаться как целочисленное значение, а результирующее значение будет предоставляться как Long.

В C # вы обычно видите это как:

public abstract class AsyncTask<TParam, TProgress, TResult>

с использованием синтаксиса 'T' для параметров типа и реализовано (с использованием приведенного выше примера) как:

public class MyStringTask : AsyncTask<string, int, long>
{
    ...
}
0 голосов
/ 16 февраля 2012

В 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> { 
  ...
}
0 голосов
/ 16 февраля 2012

В C # вы просто не можете использовать void (a.k.a. System.Void) в качестве параметра универсального типа. Библиотеки .Net решают эту проблему с помощью нескольких «перегруженных» типов, таких как Task и Task<T>.

Но я не знаю MonoDroid, так что может быть какое-то конкретное решение для него. Документация, кажется, предполагает, что есть специальный тип Java.Lang.Void, который можно использовать (вместо обычного .Net void, который здесь нельзя использовать).

...