2016-05-17 9 views
5

Rozważmy klasę:Czy jest jakaś korzyść z używania ogólnego parametru typu odniesienia, jeśli interfejs klasy jest sprzeczny?

class MyClass<T> where T: class // or T: BaseClass 
{ 
    void DoSomething1(T arg){ ... } 
    void DoSomething2(T arg){ ... } 
    ... 
    void DoSomethingN(T arg){ ... } 
} 

I nie ma powrotu T wartości! Nawet w chronionej nieruchomości lub na polu, więc potomkowie nie mogą zwrócić również T.

Czy jest jakaś korzyść z używania parametru ogólnego w porównaniu do zwykłego typu klasy podstawowej?

+1

Nie widzę problemu/pytania tutaj. Dlaczego chcesz mieć funkcje zwracające 'T'? 'T' jest używany jako parametr. W twoim przykładzie ograniczenie odnosi się do "referencyjnej" zdolności 'T'. Jeśli wybrałbyś 'T: BaseClass', to może nie istnieć przypadek użycia ogólnego parametru. – ckruczek

+0

Powiedziałbym, że nie, ponieważ nie widzę możliwości użycia konkretnego typu - jeśli nie można go użyć, nie ma żadnej wartości przy jego definiowaniu. – JanDotNet

+0

@JNS Może być trochę miejsca na optymalizację. W przypadku, gdy T jest klasą zamkniętą, czy kompilator może emitować wywołanie bez potrzeby zaglądania do VMT? –

Odpowiedz

0

Nie, nie ma żadnej korzyści. Ponieważ podajesz tylko parametry typu T, twoje metody są w zasadzie contravariant, więc równie dobrze możesz zadeklarować, że przyjmują one odniesienie BaseClass, a nie .

Powiązane problemy