Maison développement back-end Tutoriel C#.Net Introduction détaillée à la conversion des paramètres génériques C#

Introduction détaillée à la conversion des paramètres génériques C#

Mar 07, 2017 am 11:03 AM

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 是两个类型的对象。
Copier après la connexion

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";
Copier après la connexion

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)=>{};
Copier après la connexion

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来过渡
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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) !



Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Active Directory avec C# Active Directory avec C# Sep 03, 2024 pm 03:33 PM

Guide d'Active Directory avec C#. Nous discutons ici de l'introduction et du fonctionnement d'Active Directory en C# ainsi que de la syntaxe et de l'exemple.

Modificateurs d'accès en C# Modificateurs d'accès en C# Sep 03, 2024 pm 03:24 PM

Guide des modificateurs d'accès en C#. Nous avons discuté de l'introduction Types de modificateurs d'accès en C# ainsi que d'exemples et de résultats.

Générateur de nombres aléatoires en C# Générateur de nombres aléatoires en C# Sep 03, 2024 pm 03:34 PM

Guide du générateur de nombres aléatoires en C#. Nous discutons ici du fonctionnement du générateur de nombres aléatoires, du concept de nombres pseudo-aléatoires et sécurisés.

Vue Grille de données C# Vue Grille de données C# Sep 03, 2024 pm 03:32 PM

Guide de la vue Grille de données C#. Nous discutons ici des exemples de la façon dont une vue de grille de données peut être chargée et exportée à partir de la base de données SQL ou d'un fichier Excel.

Lecteur de chaînes C# Lecteur de chaînes C# Sep 03, 2024 pm 03:23 PM

Guide de C# StringReader. Nous discutons ici d'un bref aperçu de C# StringReader et de son fonctionnement avec différents exemples et codes.

Modèles en C# Modèles en C# Sep 03, 2024 pm 03:33 PM

Guide des modèles en C#. Nous discutons ici de l'introduction et des 3 principaux types de modèles en C# ainsi que de ses exemples et de l'implémentation du code.

Sérialisation C# Sérialisation C# Sep 03, 2024 pm 03:30 PM

Guide de sérialisation C#. Nous discutons ici de l'introduction, des étapes de l'objet de sérialisation C#, du fonctionnement et de l'exemple respectivement.

Écrivain de chaînes C# Écrivain de chaînes C# Sep 03, 2024 pm 03:23 PM

Guide de C# StringWriter. Nous discutons ici d'un bref aperçu de la classe C# StringWriter et de son fonctionnement avec différents exemples et codes.

See all articles