Вопрос по nul, api, generics, api-design, c# – C # Generics: Если T является возвращаемым типом, может ли он также быть недействительным? Как я могу объединить эти интерфейсы вместе?

21

У меня есть следующий интерфейс, который возвращает универсальный параметр типа T с помощью обратного вызова ...

public interface IDoWork<T>
{
    T DoWork();
}

однако у меня также есть следующий интерфейс, но он не будет вызывать обратный вызов, так как он возвращает void.

public interface IDoWork
{
    void DoWork();
}

Могу ли я объединить эти два интерфейса и использовать логику времени выполнения, чтобы определить разницу? Как я могу это сделать?

@ThomasLevesque Где я могу узнать больше о том, как подход .NET является преимуществом перед Java? random65537
Жаль, что вы не на земле Java, так как вы были бы полностью способны сделать что-то вродеIDoWork<Void> ..., Я немного удивлен, что C # не предлагает такую вещь. Chris Cashwell
Спасибо @ThomasLevesque; Версия TL; DR. Преимущества обобщений C # перед Java заключаются в улучшении производительности, глубокой проверке безопасности типов и отражении random65537
@ChrisCashwell, потому что .NET-дженерики встроены в CLR, тогда как в Java это всего лишь трюк компилятора (JVM ничего не знает о дженериках во время выполнения). Хотя это обычно является преимуществом обобщений .NET, это также означает, что правила более строгие ... Thomas Levesque
@ makerofthings7, см.this question Thomas Levesque

Ваш Ответ

2   ответа
20

Вы можете видеть это в рамках - вот почему существует отдельныйTask а такжеTask<T> класс, например.

Тем не менее, вы часто можете поделиться реализациями в этом типе сценария с помощьюIDoWork<object> и прохождениеnull для ценностей и т. д.

@ makerofthings7 Вы ~ могли бы ~ - но это может быть неуместно, если значение null является ожидаемым или действительным значением ..
@ShaunWilde Я бы тоже - у меня было два отдельных интерфейса в этом типе сценария, поскольку они действительно очень разные.
Лично, поскольку их поведение отличается, я бы хотел дать им немного другие имена, чтобы выразить эту разницу.
Интересно, если T == object и object == null в реализации, тогда я могу пропустить обратный вызов в хосте. Это звучит разумно? random65537
1

поэтому T DoWork () и void DoWork () различаются, и void не является типом и не являетсяnull, Это признак того, что в стеке оценки ничего нет при возврате из метода.

В C # возвращаемый тип не является частьюmethod signature

Похожие вопросы