Dans les modèles C ++, on peut spécifier qu'un certain paramètre de type est une valeur par défaut. Sauf indication contraire explicite, il utilisera le type T.
Cela peut-il être fait ou estimé en C #?
Je recherche quelque chose comme:
public class MyTemplate<T1, T2=string> {}
Pour qu'une instance du type qui ne spécifie pas explicitement T2
:
MyTemplate<int> t = new MyTemplate<int>();
Serait essentiellement:
MyTemplate<int, string> t = new MyTemplate<int, string>();
En fin de compte, je regarde un cas dans lequel il existe un modèle assez largement utilisé, mais j'envisage de l'étendre avec un paramètre de type supplémentaire. Je pourrais sous-classer, je suppose, mais j'étais curieux de savoir s'il y avait d'autres options dans cette veine.
overloadable
par nombre de paramètres.Une solution est le sous-classement. Un autre que j'utiliserais à la place, ce sont les méthodes d'usine (combinées avec le mot-clé var).
Dans l'exemple ci-dessus, il
val2
s'agit d'un typeMyTemplate<int,string>
et non d' un type dérivé de celui-ci.Un type
class MyStringTemplate<T>:MyTemplate<T,string>
n'est pas du même type queMyTemplate<T,string>
. Cela pourrait poser des problèmes dans certains scénarios. Par exemple, vous ne pouvez pas diffuser une instance deMyTemplate<T,string>
toMyStringTemplate<T>
.la source
vous pouvez également créer une surcharge de classe comme ceci
la source
MyTemplate<T1>
est une classe différente deMyTemplate<T1, T2>
, niAnotherTemplate<T1>
.MyTemplate<T1, string>
ne peut pas être assignéMyTemplate<T1>
, ce qui peut être souhaitableC # ne prend pas en charge une telle fonctionnalité.
Comme vous l'avez dit, vous pouvez le sous-classer (s'il n'est pas scellé et dupliquer toutes les déclarations du constructeur) mais c'est une chose complètement différente.
la source
Malheureusement, C # ne prend pas en charge ce que vous essayez de faire. Ce serait une fonctionnalité difficile à mettre en œuvre étant donné que le type par défaut pour un paramètre devrait respecter les contraintes génériques et créerait très probablement des maux de tête lorsque le CLR tenterait d'assurer la sécurité du type.
la source