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 ... }
3 Réponses :
Vous devez utiliser Vous pouvez également spécifier la valeur par défaut Suivre les commentaires, en cas d'utilisation de comparer code>
méthode au lieu de << / code> ou
> code> opérateurs. Et appliquer les contraintes génériques correctes, pour les types numériques, il doit être
Icomarable, IComparable
où T: struct, icomparable
struct code> est important ici, car vous comparez des types de valeur )
min code> comme
t min = par défaut (t) code>, mais vous ne pouvez pas faire ça Pour
max code> valeur. p>
nullable
min code> et
max code> valeurs Le code peut être écrit comme p>
Merci pour ton aide. Q1 est très clair maintenant pour moi. Mais toujours, Q2 est un problème .. min code> 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 code> et
max code> de
t code>, il est expliqué dans ce
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
si (max == null) max = (t) 10 code> . Mais maintenant, je ne peux pas attribuer la valeur pour cela.
@ J.-h.bak t code> peut être une valeur numérique, pas seulement le
int code>, donc
max = (t) 10 code> n'est pas Valable, malheureusement. Vous pouvez utiliser
convert.changetype code> pour cela. En cas de nullable
t code>, vous devez accéder à la propriété code> de la valeur code> de celui-ci
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
Merci pour votre précieuse aide. :) Maintenant, je me rends compte que j'ai complètement mal compris icomparable code> chose.
L'astuce utilise les méthodes Icomarable, pas les opérateurs de comparaison. Dans ce cas, le comparèteo a > Méthode Les valeurs par défaut pour les paramètres ne sont pas faciles, vous êtes supposant que les valeurs numériques et font de la distribution directe, mais la chose qui peut être n'importe quel type de données Icomarable p> violon: https://dotnetfiddle.net/fjuddr p> p>
Merci pour votre bonne réponse et partageez votre temps pour cela. Cela m'aide beaucoup!
Avez-vous regardé l'exemple MSDN? docs.microsoft.com/fr- US / DotNet / API / ...
Icomarable Code> Définit
comparèteo code>, pas les opérateurs de comparaison. Donc, au lieu de
Val par exemple, vous devez utiliser
val.compareto (min) == -1 code>
... et vous ne pouvez pas utiliser les valeurs par défaut
int code> pour votre implémentation générique, le meilleur que vous puissiez faire est
int min = par défaut code> 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) code> 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) code>.
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 code> et maintenant je viens de vérifier
min == null code> et
max = = null code>. Mais je ne peux pas affecter de valeur par défaut telle que
si (min == null) max = (t) 10 code>. Des idées pour résoudre ce dernier problème?
Je pense
PLAMP () CODE>
, PAScoerce () code> 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 :)