2012-05-17 15 views
21

He la interfaz siguiente que devuelve el parámetro genérico de tipo T usando una devolución de llamada ...C# Genéricos: si T es un tipo de devolución, ¿también puede ser nulo? ¿Cómo puedo combinar estas interfaces?

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

sin embargo también tengo la siguiente interfaz, así, pero no va a invocar una devolución de llamada, ya que devuelve void .

public interface IDoWork 
{ 
    void DoWork(); 
} 

¿Puedo combinar estas dos interfaces y usar la lógica de tiempo de ejecución para determinar la diferencia? ¿Cómo puedo hacer eso?

+0

Lástima que no estés en tierra de Java, ya que serías totalmente capaz de hacer algo como 'IDoWork ...'. Estoy sorprendido de que C# no ofrezca tal cosa. –

+1

@ChrisCashwell, eso es porque los genéricos .NET están integrados en el CLR, mientras que en Java es solo un truco de compilación (la JVM no sabe nada sobre los genéricos en el tiempo de ejecución). Si bien esto suele ser una ventaja de los genéricos .NET, también significa que las reglas son más estrictas ... –

+0

@ThomasLevesque ¿Dónde puedo obtener más información sobre cómo el enfoque de .NET es una ventaja sobre Java? – LamonteCristo

Respuesta

20

Desafortunadamente, no se pueden combinar.

Puede ver esto en el marco - por eso hay una clase Task y Task<T> por separado, por ejemplo.

Dicho esto, a menudo se puede compartir implementaciones en este tipo de escenario mediante el uso de IDoWork<object> y pasando null de valores, etc.

+0

Me pregunto si T == objeto y objeto == nulo en la implementación, entonces puedo omitir la devolución de llamada en el host. ¿Eso suena razonable? – LamonteCristo

+0

@ makerofthings7 Usted ~ podría ~ - pero puede ser inapropiado si null es un valor esperado o válido. –

+1

Personalmente, dado que su comportamiento es diferente, me gustaría darles nombres ligeramente diferentes para expresar esa diferencia. –

1

tipo de retorno es una parte de la firma del método, por lo DoWork T() y DoWork vacío() son diferentes, y el vacío no es un tipo y no es un null. Es una indicación de que no hay nada en la pila de evaluación al regresar del método.

+0

En C# return type no es parte de [method signature] (https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx) – suhair

Cuestiones relacionadas