2017-02-13 9 views
10

Rozważmy następującą metodę Generic:Nadmiarowe ograniczenie ogólne?

public T2 Frob<T1, T2>(T1 item) 
     where T1 : class, T2 
     => item as T2; 

Kompilator odmówić skompilować ten kod; Parametr typu „T2” nie może być używane z „jako” operatora, ponieważ nie ma ograniczenia typu klasy ani „klasa” ograniczenie

OK, to jest łatwo rozwiązywalne prostu robi:

public T2 Frob<T1, T2>(T1 item) 
     where T1 : class, T2 
     where T2 : class 
     => item as T2; 

Ale czy to nie jest zbyteczne? Czy jest jakiś możliwy T2, który nie jest class biorąc pod uwagę ograniczenia już obowiązujące dla T1?

Moje pytanie nie jest dlaczego to "wnioskowanie" nie zostało zaimplementowane w kompilatorze, powodem może być po prostu "nikt o tym nie myślał" i to jest w porządku. Jestem bardziej zainteresowany wiedząc, czy moje rozumowanie jest poprawne, ponieważ T2 jest skutecznie i we wszystkich przypadkach ograniczone do class w pierwszym przykładzie, nawet jeśli nie zostało wyraźnie wymuszone.

+0

Jak myślisz, dlaczego ograniczenia dla "T1" również mają zastosowanie do 'T2'? Nie mają ze sobą nic wspólnego, w szczególności gdy 'T1' * pochodzi * od' T2', 'T2' nie zna * niczego * z' T1'. – HimBromBeere

+0

Oczywiście, ale samo 'T2' nie jest ograniczone do niczego, może to być nawet' struct ". – HimBromBeere

+1

@HimBromBeere daje mi jeden przykład klasy odniesienia wywodzącej się z typu wartości, ponieważ dokładnie to musi się stać z ograniczeniami obowiązującymi dla 'T1'. – InBetween

Odpowiedz

4

My interpretacja tego względu C# 5,0 specyfikacje znaczy w 7.10.11 The as operatora:

operacji w postaci E as T, E musi być ekspresja i T musi być typu odniesienie , parametr typu znany jako typ odniesienia lub typ nullby.

Kompilator w tym momencie uważa tylko T2 w tym bloku:

public T2 Frob<T1, T2>(T1 item) 
     where T1 : class, T2 
     => item as T2; 

I widzi, że T2 sama nie jest ograniczony. Oczywiście, może to odliczyć że w tym przypadku T1 ma być rodzajem odniesienia i dziedziczą T2, dlatego że sama T2 powinny być również rodzaj odniesienia, ale jestem pewien, że istnieją powody, dla których nie robi.

+3

Właściwie to prawdopodobnie * nie ma * powodów, aby robić to inaczej niż to, co Eric Lippert zauważa w tej odpowiedzi: http://stackoverflow.com/a/1843557. TL; DR: "Funkcje wymagają czasu na wdrożenie." – aquinas

Powiązane problemy