W szablonach C ++ można określić, że określony parametr typu jest domyślny. To znaczy, o ile nie zostanie to wyraźnie określone, użyje typu T.
Czy można to zrobić lub przybliżyć w C #?
Szukam czegoś takiego:
public class MyTemplate<T1, T2=string> {}
Tak, że instancja typu, który nie określa jawnie T2
:
MyTemplate<int> t = new MyTemplate<int>();
Byłoby zasadniczo:
MyTemplate<int, string> t = new MyTemplate<int, string>();
Ostatecznie patrzę na przypadek, w którym istnieje szablon, który jest dość szeroko stosowany, ale rozważam rozszerzenie o dodatkowy parametr typu. Chyba mógłbym podklasować, ale byłem ciekawy, czy w tym duchu są inne opcje.
overloadable
według liczby parametrów.Jednym z rozwiązań jest tworzenie podklas. Innym, którego użyłbym zamiast tego, są metody fabryczne (w połączeniu ze słowem kluczowym var).
public class MyTemplate<T1,T2> { public MyTemplate(..args..) { ... } // constructor } public static class MyTemplate{ public static MyTemplate<T1,T2> Create<T1,T2>(..args..) { return new MyTemplate<T1, T2>(... params ...); } public static MyTemplate<T1, string> Create<T1>(...args...) { return new MyTemplate<T1, string>(... params ...); } } var val1 = MyTemplate.Create<int,decimal>(); var val2 = MyTemplate.Create<int>();
W powyższym przykładzie
val2
jest to typ,MyTemplate<int,string>
a nie typ wyprowadzony z niego.Typ
class MyStringTemplate<T>:MyTemplate<T,string>
nie jest tym samym typem, coMyTemplate<T,string>
. Może to spowodować pewne problemy w niektórych scenariuszach. Na przykład nie możesz przesłać instancjiMyTemplate<T,string>
doMyStringTemplate<T>
.źródło
możesz także stworzyć taką klasę Overload
public class MyTemplate<T1, T2> { public T1 Prop1 { get; set; } public T2 Prop2 { get; set; } } public class MyTemplate<T1> : MyTemplate<T1, string>{}
źródło
MyTemplate<T1>
jest inną klasąMyTemplate<T1, T2>
, ani teżAnotherTemplate<T1>
.MyTemplate<T1, string>
nie można przypisać doMyTemplate<T1>
, co może być pożądaneC # nie obsługuje takiej funkcji.
Jak powiedziałeś, możesz podklasować go (jeśli nie jest zapieczętowany i zduplikować wszystkie deklaracje konstruktora), ale to zupełnie inna sprawa.
źródło
Niestety C # nie obsługuje tego, co próbujesz zrobić. Byłaby trudna do zaimplementowania, biorąc pod uwagę, że domyślny typ parametru musiałby być zgodny z ogólnymi ograniczeniami i najprawdopodobniej spowodowałby ból głowy, gdy CLR próbowałby zapewnić bezpieczeństwo typu.
źródło