https://wiki.bananeatomic.fr/index.php?title=G%C3%A9n%C3%A9riques&feed=atom&action=historyGénériques - Historique des versions2024-03-29T14:48:35ZHistorique des versions pour cette page sur le wikiMediaWiki 1.39.5https://wiki.bananeatomic.fr/index.php?title=G%C3%A9n%C3%A9riques&diff=11667&oldid=prevNicolas : /* Cast */2016-09-10T22:02:36Z<p><span dir="auto"><span class="autocomment">Cast</span></span></p>
<p><b>Nouvelle page</b></p><div>[[Category:CSharp]]<br />
= Contrainte where =<br />
<kode lang="csharp"><br />
class MaClasse<T, U, V><br />
where T : IInterface, new()<br />
where U : AutreClasse<br />
where V : class // par opposition à struct<br />
{<br />
// La contrainte new() test si le type T a un constructeur sans argument ou un constructeur par défaut.<br />
// Sachant qu'un tel constructeur existe on peut l'utiliser.<br />
T item = new T();<br />
}<br />
</kode><br />
<br />
= Cast =<br />
[[CSharp_4#Covariance_et_Contra_variance_des_g.C3.A9n.C3.A9riques|Covariance et Contra variance]]<br />
<kode lang=csharp><br />
// un cast implicite d'un type int dans un type object<br />
object o;<br />
o = 0;<br />
<br />
// pour les génériques ce n'est pas aussi simple<br />
List<object> lo;<br />
lo = new List<int>(); // impossible de convertir implicitement List<int> en List<object><br />
// normal car sinon on pourrait écrire le code suivant<br />
lo.Add("MaChaine");<br />
// ce qui reviendrait à ajouter un string dans une List de int<br />
<br />
// il faut donc spécifier comment l'on souhaite convertir un int en object : méthode ConvertAll pour List<br />
lo = new List<int>().ConvertAll(i => (object)i);<br />
<br />
<br />
// par contre on peut écrire le code suivant, car on instancie une List d'object et non une List de int comme précédemment<br />
var lo = new List<object>();<br />
lo.Add(0);<br />
lo.Add("MaChaine");<br />
</kode><br />
<br />
Implémentation d'un Convert like<br />
<kode lang=csharp><br />
// un cast un type int dans un type object<br />
public class Generic<T><br />
{<br />
public T Value { get; set; }<br />
<br />
public Generic<TOutput> Convert<TOutput>(Converter<T, TOutput> converter)<br />
{<br />
if (converter == null)<br />
{<br />
throw new ArgumentNullException("converter");<br />
}<br />
var generic = new Generic<TOutput>();<br />
generic.Value = converter(this.Value);<br />
return generic;<br />
}<br />
}<br />
<br />
// Utilisation<br />
Generic<object> gObject = new Generic<object>() { Value = 0 };<br />
<br />
Generic<int> gInt = gObject.Convert(o => (int)o);<br />
</kode><br />
<br />
= [http://msdn.microsoft.com/fr-fr/library/xwth0h0d.aspx Default] =<br />
Utile pour construire un objet T si l'on ne sait pas si T sera un type référence ou un type valeur.<br />
<kode lang=csharp><br />
public T GetValue<T>()<br />
{<br />
...<br />
return default(T);<br />
}<br />
</kode><br />
<br />
= [[Réflexion#Types générique|Créer un type générique par réflexion]] =<br />
<br />
= [[Les méthodes d'extension]] =</div>Nicolas