Cet article présente les connaissances pertinentes sur la conversion des paramètres génériques C#, qui ont une bonne valeur de référence. Jetons-y un coup d'œil avec l'éditeur
Les objets générés par différents types de paramètres génériques sont indépendants. l'un l'autre.
//如 Tuple<string> ts; Tuple<object> to; //ts to 是两个类型的对象。
Souvent, nous souhaitons implémenter l'opération to = ts, pourquoi ? Parce qu'il semble que cela devrait l'être.
Afin d'atteindre cet objectif, il est nécessaire de résoudre le "problème de conversion des paramètres génériques". Le point de connaissance de ce problème est la variante générique in out. Pour être honnête, le problème en lui-même n’est pas difficile, il est juste très peu intuitif et facile à oublier.
Tout d'abord, pour réaliser to = ts, il y a en fait un prérequis, c'est-à-dire que ce paramètre ne peut être utilisé que sur le "type de retour".
//如 delegate object FuncObj(); FuncObj func = ()=>"string";
La raison pour laquelle func réussit est que la chaîne peut être convertie en objet. Lorsque "l'utilisateur" appelle func, ce qu'il espère obtenir est l'objet objet, et la chaîne est également un objet objet, donc il n'y a pas de problème.
La clé ici est d'apprendre à analyser les problèmes du point de vue de « l'utilisateur ».
//A delegate void FuncObj2(object obj); FuncObj2 func2 = (string str)=>{}; //B delegate void FuncStr(string str); FuncStr func3 = (object obj)=>{};
Analysez ces deux ensembles de codes, lequel est le plus raisonnable ?
Du point de vue de l'utilisateur, il utilise func2 et func3
Lorsque l'utilisateur utilise func2, l'objet passé doit être un objet, mais la fonction réelle traitée est (string)=> { }, l'objet ne peut pas être converti en chaîne, c'est donc très déraisonnable.
Lorsque les utilisateurs utilisent func3, l'objet transmis ne peut être qu'une chaîne, mais la fonction réelle traitée est (object)=>{} La chaîne peut être convertie en objet, c'est donc raisonnable.
Bien entendu, ces deux ensembles de codes ne sont pas valides car les types de paramètres de fonction ne correspondent pas.
Mais les génériques fournissent une méthode pour convertir implicitement des objets dont les types ne correspondent pas ! La logique qu’il met en œuvre est analysée ci-dessus.
//out 修饰返回类型 delegate ResultType FuncOut<out ResultType>(); //in 修饰参数类型 delegate void FuncIn<in ParamType>(ParamType param); //这是一开始我们想做到的目标 FuncOut<object> fun4 = () => "string"; //这个效果恰好相反 FuncIn<object> funcobj = (object obj) => { }; FuncIn<string> fun5 = funcobj; //注意,泛型变体一般只能和泛型变体之间隐式转换 //lambda表达式会自动转换成参数相同的泛型变体,但无法接着做变体之间的隐式转换,所以需要funcobj来过渡
out modifie le type de retour, et in modifie le type de paramètre, ce qui est assez vif, mais faites attention au paramètre générique in, qui est exactement le contraire du paramètre out.
Au début, nous voulions implémenter to = ts, mais nous n'avons vu que la moitié du problème. En fait, il y a une possibilité de ts = to dans les génériques. J'espère que les lecteurs pourront comprendre cela.
Résumé :
out : to = ts; in : ts = to;
Aucune modification : aux, ts sont totalement indépendants.
-------------------------- (Remarques)------------- -- ----------------
paramètre out : ne peut être utilisé que dans les types de retour.
en paramètre : ne peut être utilisé qu'en paramètres.
Aucune modification : n'importe quel poste.
--------------------------(Remarque 2)------------- - -----------------
Les paramètres génériques In et out ne peuvent être utilisés que sur les délégués et les interfaces.
//综合运用 delegate ResultType FuncInOut<in ParamType, out ResultType>(ParamType param); FuncInOut<object, string> funcobj2 = (object obj) => "string"; FuncInOut<string, object> func6 = funcobj2;
Ce qui précède est l'introduction détaillée de la conversion des paramètres génériques C#. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !