Maison >développement back-end >C++ >Comment les contraintes génériques peuvent-elles différencier efficacement les types valeur et référence en C# ?

Comment les contraintes génériques peuvent-elles différencier efficacement les types valeur et référence en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-30 19:00:16951parcourir

How Can Generic Constraints Effectively Differentiate Between Value and Reference Types in C#?

Contraintes génériques : Distinguer les types valeur et référence

Introduction

En programmation générique, les contraintes nous permettent de spécifier des restrictions sur les paramètres de type. Un problème courant consiste à faire la différence entre les types valeur (par exemple, les entiers) et les types référence (par exemple, les chaînes). Cette question explore un cas où les contraintes sur les paramètres de type ne se résolvaient pas comme prévu.

Le problème

L'auteur a posé le défi de faire la distinction entre différents scénarios de type valeur : simple types de valeur (int), types de valeur nullables (int?) et types de référence (string). Initialement, ils ont proposé d'utiliser Where T : struct pour identifier les types de structure (types de valeur) et Where T : class pour identifier les types de référence, mais cela a entraîné une erreur de compilation en raison de définitions de membres en double.

Le Solution

L'idée clé est que les contraintes ne font pas partie de la signature de la méthode et que la résolution des surcharges prend en compte les types de paramètres. Ainsi, l'auteur a placé la contrainte dans un paramètre pour différencier les types valeur et référence. Voici le code révisé :

class RequireStruct<T> where T : struct { }
class RequireClass<T> where T : class { }

static void Foo<T>(T a, RequireStruct<T> ignore = null) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // 3

En utilisant ces classes d'assistance, le code fait désormais correctement la distinction entre les différents scénarios de type valeur. Foo(z) sera compilé et mappé à la méthode (3), car la chaîne est un type de référence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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