2010-04-10 2 views
6

В настоящее время я работаю с .Net 2.0 и имеет интерфейс, общий тип которого используется для определения возвращаемого типа метода. Что-то вродеjava.lang.Void in C#?

interface IExecutor<T> { 
    T Execute() { ... } 
} 

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

В Java вы можете использовать java.lang.Void для этой цели, но после довольно небольшого поиска я не нашел эквивалента в C#. В общем, я также не нашел хорошего пути решения этой проблемы. Я попытался найти, как люди будут делать это с делегатами, но ничего не обнаружил - что заставляет меня поверить, что проблема в том, что я сосать при поиске :)

Так что это лучший способ решить эту проблему? Как бы вы это сделали?

Спасибо!

+2

Я не знаю решения, отличного от того, чтобы выбрасывать общую информацию и использовать разные классы/интерфейсы для случаев «void» и «non-'void». Это то, что сам .NET делает с типами «Func» и «Action» в 3.5. Исходя из C++, это часто меня раздражает, но я не знал, что у Java тоже есть способ. – jalf

ответ

6

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

Вот идея для второго:

public class Void 
{ 
    public static readonly Instance = null; // You don't even need this line 
    private Void(){} 
} 

таким образом кто-то не может создать экземпляр класса. Но у вас есть что представить. Я думаю, что это может быть самый элегантный способ сделать то, что вы хотите.

Кроме того, вы можете захотеть сделать класс sealed.

+0

Да, это то, что я так и думал ... Я использовал объект и думал о создании моей собственной Пустоты, но оба казались такими уродливыми, что я подумал, что лучше спросить. Спасибо! – anog

0

Просто используйте Object как тип и верните null. Это означает, что вам может потребоваться написать адаптер, если вам нужно позвонить в делексию, у которого действительно есть возвращаемый тип void