web-dev-qa-db-fra.com

Fonction de modèle en C # - Type de retour?

Il semble que c # ne supporte pas le c ++ comme les templates. Par exemple

template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}

Je veux que ma fonction ait un type de retour basé sur ses paramètres, comment puis-je l'obtenir en c #? Comment utiliser des modèles en C #

EDIT: Puis-je utiliser object et getType dans le même but?

17
SMUsamaShah

Les modèles les plus proches de C++ dans C # sont les génériques - mais ils ne sont pas très proches. En particulier, vous ne pouvez pas utiliser d'opérateurs tels que > entre les valeurs de type génériques, car le compilateur ne les connaît pas (et vous ne pouvez pas contraindre les types basés sur des opérateurs). Par contre, vous pouvez écrire:

public T GetMax<T>(T lhs, T rhs)
{
    return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
}

ou

public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
{
    return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
}

Notez que le premier d'entre eux est null-safe; le second ne l'est pas.

Une description complète des génériques va bien au-delà de la portée d'une réponse Stack Overflow; MSDN a des informations, ou consultez votre livre C # préféré.

32
Jon Skeet

Les génériques en C # ne sont pas aussi puissants que les modèles en C++. Ce que vous voulez faire ne fonctionne pas en C #.

Un hack/solution de contournement pour votre situation est

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
6
Matt Greer

Vous utilisez les génériques en C # pour obtenir des fonctionnalités similaires à celles des modèles.

http://msdn.Microsoft.com/en-us/library/ms379564(VS.80).aspx

public class MyType<T>
{
}
2
Brad Cunningham

Vous aurez envie de regarder génériques . Syntaxe:

public T GetMax<T>(T a, T b) {
    return (a>b?a:b);
}

UPDATE à cause de certains commentaires ... Je voulais juste vous donner un aperçu très rapide. Oui, je suppose que cela ne compile pas ou ne fonctionne pas correctement. Mais c’est là l’idée de base sur ce à quoi cela ressemblerait. Vous trouverez des réponses plus complètes sur ce sujet - en attendant.

Syntaxe d'exécution:

int a = 5;
int b = 10;
int result = GetMax(a, b);

J'espère que cela t'aides,

Cordialement, Thomas

2
thmshd

Votre code deviendrait quelque chose comme ceci:

public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
2
Lee

Tu veux dire quelque chose comme ca

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }
0
Siddarth Kanted

Génériques!

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}
0
Jake Kalstad