2012-05-17 8 views
21

Mam następujący interfejs, który zwraca rodzajowego parametr typu T za pomocą zwrotnego ...C# Generics: Jeśli T jest typem zwrotnym, czy może być również nieważne? Jak mogę łączyć te interfejsy?

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

jednak ja też mam następujący interfejs, jak również, ale nie będzie wywołania zwrotnego, ponieważ zwraca void .

public interface IDoWork 
{ 
    void DoWork(); 
} 

Czy mogę połączyć te dwa interfejsy i użyć logiki wykonawczej do określenia różnicy? Jak mogę to zrobić?

+0

Szkoda, że ​​nie jesteś w Jawie, ponieważ byłbyś w stanie zrobić coś w stylu "IDoWork ...". Jestem zaskoczony, że C# nie oferuje czegoś takiego. –

+1

@ChrisCashwell, to dlatego, że .NET generics są wbudowane w CLR, podczas gdy w Javie jest to po prostu sztuczka kompilatora (JVM nie wie nic o generycznych w czasie wykonywania). Chociaż jest to zwykle zaleta generycznych .NET, oznacza to również, że zasady są bardziej restrykcyjne ... –

+0

@ThomasLevesque Gdzie mogę dowiedzieć się więcej, w jaki sposób podejście .NET jest przewagą nad Javą? – LamonteCristo

Odpowiedz

20

Niestety, nie można ich połączyć.

Można to zobaczyć w ramach - dlatego istnieje osobna klasa Task i Task<T>, na przykład.

Mając na uwadze powyższe, można często implementacje udział w tym rodzaju scenariusza przy użyciu IDoWork<object> i przechodzącej null dla wartości itp

+0

Zastanawiam się, czy obiekt T == i obiekt == null w implementacji, mogę pominąć wywołanie zwrotne w hoście. Czy to brzmi rozsądnie? – LamonteCristo

+0

@ makerofthings7 You ~ could ~ - ale może być niewłaściwe, jeśli wartość null jest wartością oczekiwaną lub prawidłową. –

+1

Osobiście, ponieważ ich zachowanie jest inne, chciałbym nadać im nieco inne nazwy, aby wyrazić tę różnicę. –

1

typ zwracany jest częścią podpisu metody, więc T DoWork() i void DoWork() są różne, a void nie jest typem i nie jest to null. Jest to wskazówka, że ​​nie ma nic w stosie ewaluacyjnym po powrocie z metody.

+0

W języku C# typ zwracany nie jest częścią [metody signature] (https://msdn.microsoft.com/en-us/library/aa691131%28v=vs.71%29.aspx) – suhair

Powiązane problemy