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.
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
Oczywiście, ale samo 'T2' nie jest ograniczone do niczego, może to być nawet' struct ". – HimBromBeere
@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