0
votes

Comment puis-je faire cette méthode simple dans une méthode générique?

J'ai une méthode comme suit:

T coerce<T>(T val, T min=(T)0, T max=(T)10) where T:IComparable
{
    // ... same as the above ...
}


8 commentaires

Avez-vous regardé l'exemple MSDN? docs.microsoft.com/fr- US / DotNet / API / ...


Icomarable Définit comparèteo , pas les opérateurs de comparaison. Donc, au lieu de Val par exemple, vous devez utiliser val.compareto (min) == -1


... et vous ne pouvez pas utiliser les valeurs par défaut int pour votre implémentation générique, le meilleur que vous puissiez faire est int min = par défaut mais imo, vous ne devez pas essayer de mettre en œuvre les valeurs par défaut dans cette méthode.


Comment puis-je définir des valeurs par défaut pour l'argument de type générique? - Vous pouvez utiliser le par défaut (t) qui définit la valeur par défaut du type de données. Dans votre cas 0 pour entier.


Merci pour les gars de l'aide, le Q1 est très clair pour moi. Mais pour Q2, la valeur par défaut de la variable 'min' peut ne pas être 0. Donc, je ne peux donc pas utiliser par défaut (t) .


Les gars, pour le Q2, j'ai une idée de résoudre le problème. T coerce (t val, t? min, t? max) Où T: struct et maintenant je viens de vérifier min == null et max = = null . Mais je ne peux pas affecter de valeur par défaut telle que si (min == null) max = (t) 10 . Des idées pour résoudre ce dernier problème?


Je pense PLAMP () , PAS coerce () serait un nom plus approprié et bien connu pour cette méthode. Avec cela à l'esprit, bon nombre des réponses à Où puis-je trouver la fonction "pince" dans .NET? fournir un générique mise en œuvre de cela.


Merci pour votre conseil, @bacon! En fait, je ne suis pas un orateur anglais natif. Donc, ces types de conseils sont si précieux pour moi. Merci encore :)


3 Réponses :


2
votes

Vous devez utiliser comparer méthode au lieu de << / code> ou > opérateurs. Et appliquer les contraintes génériques correctes, pour les types numériques, il doit être Icomarable, IComparable , iconvertible, IEQUABLE , iformattable . Cependant, vous pouvez laisser uniquement où T: struct, icomparable , il devrait suffire à vos besoins (mais struct est important ici, car vous comparez des types de valeur ) xxx

Vous pouvez également spécifier la valeur par défaut min comme t min = par défaut (t) , mais vous ne pouvez pas faire ça Pour max valeur.

Suivre les commentaires, en cas d'utilisation de nullable pour min et max valeurs Le code peut être écrit comme xxx


4 commentaires

Merci pour ton aide. Q1 est très clair maintenant pour moi. Mais toujours, Q2 est un problème .. min n'a pas pu être 0, donc je ne peux donc pas utiliser par défaut (t) le code ci-dessus n'est qu'un exemple simplifié de mien. Quoi qu'il en soit, merci pour l'aide !!


@ J.-h.bak Vous pouvez utiliser une réflexion pour obtenir et min et max de t , il est expliqué dans ce Réponse , mais cela ressemble à une overcilleuse ici, imo. Spécification d'une valeur explicite directement est plus claire et lise


Merci pour le commentaire. Je suis d'accord avec cela c'est un gaspillage. Ici, j'apporte une nouvelle idée d'attribution de valeur par défaut pour les paramètres d'entrée. Mais a encore besoin d'une étape. Puis-je demander une aide de plus pour compléter cette idée? T coerce (t val, t? min, t? max) où T: struct puis si (max == null) max = (t) 10 . Mais maintenant, je ne peux pas attribuer la valeur pour cela.


@ J.-h.bak t peut être une valeur numérique, pas seulement le int , donc max = (t) 10 n'est pas Valable, malheureusement. Vous pouvez utiliser convert.changetype pour cela. En cas de nullable t , vous devez accéder à la propriété de la valeur de celui-ci



0
votes
public T Max<T>(T val, T min, T max) where T : IComparable<T>
{
    if (val.CompareTo(min) == -1)
        return min;

    if (val.CompareTo(min) == 1)
        return max;

    return val;
}
Detail

1 commentaires

Merci pour votre précieuse aide. :) Maintenant, je me rends compte que j'ai complètement mal compris icomparable chose.



0
votes

1 commentaires

Merci pour votre bonne réponse et partageez votre temps pour cela. Cela m'aide beaucoup!