J'écris une méthode pour faire une conversion de type intelligente - à l'aide de tostring () si le paramètre Type se trouve être une chaîne, sinon la coulée, mais renvoyant null si la distribution ne fonctionne pas. Essentiellement obtenir autant d'informations de Je vérifie que et voici ma méthode: p> aussi laissez-moi savoir si c'est une sorte de péché impardonnable. Je l'utilise pour traiter certaines structures de données pouvant avoir des types mixtes. P> p> v code> il peut sans lancer une exception.
t code> est en effet une chaîne code> avant que je tente le casting, mais le compilateur n'est toujours pas un ventilateur: p>
4 Réponses :
Vous devez lancer votre chaîne sous forme code> objet code> car votre type de retour est générique I.e.
return (T)(object)v.ToString();
Ce n'est pas la boxe. Il n'y a pas de types de valeur impliqués.
Vous devez essentiellement aller via et p> voir Eric Lippert ''s récent blog post Pour plus de détails sur pourquoi cela est nécessaire . P> en particulier: P> Étant donné que le compilateur sait que la seule façon de réussir que cette conversion pourrait éventuellement réussir, c'est si (substitut objet code> lors de la coulée sur un type générique:
est code> plutôt que d'attraper un
invalidalcastexception code> cependant. P>
u code> est bool, mais
u code> peut être n'importe quoi! Le compilateur suppose que la plupart du temps
u code> ne sera pas construit avec
bool code>, et donc ce code est presque certainement une erreur et le compilateur porte ce fait à votre attention. P>
blockquote>
t code> pour
u code> et
chaîne code> pour
bool code> ...) p> p>
comme code> serait-il le meilleur choix ici?
@SteveczEtty: Nous ne savons pas que t code> est un type nullable, donc
comme code> ne fonctionnerait pas (IIRC).
Bon point. Bien que je ne pense pas que est code> fonctionnera soit, sauf si
t code> est contraint à une classe
code>. (IIRC, aussi)
@Steveczetty: Oui, vous pouvez utiliser est code> avec n'importe quel type de type. Par exemple:
objet O = 10; Si (O est INT) ... code>
@BehnamesMaili: Où est le type de valeur qui serait en boîte?
Essayez de convertir en objet code> avant de convertir sur t code>
public T Convert<T>(object v) { return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v); }
Il y a d'autres problèmes. Votre méthode ne peut pas avoir de type de retour
t? Code> quand il n'y a pas de contrainte sur
t code>. Par exemple, il n'y a rien appelé
chaîne? Code> car la chaîne est un type de référence.