7
votes

Corder la chaîne de type générique qui est une chaîne

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 v il peut sans lancer une exception.

Je vérifie que t est en effet une chaîne avant que je tente le casting, mais le compilateur n'est toujours pas un ventilateur: xxx

et voici ma méthode: xxx

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.


1 commentaires

Il y a d'autres problèmes. Votre méthode ne peut pas avoir de type de retour t? quand il n'y a pas de contrainte sur t . Par exemple, il n'y a rien appelé chaîne? car la chaîne est un type de référence.


4 Réponses :


3
votes

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();


1 commentaires

Ce n'est pas la boxe. Il n'y a pas de types de valeur impliqués.



28
votes

Vous devez essentiellement aller via objet lors de la coulée sur un type générique: xxx

et xxx p > J'utiliserais est plutôt que d'attraper un invalidalcastexception cependant.

voir Eric Lippert ''s récent blog post Pour plus de détails sur pourquoi cela est nécessaire .

en particulier:

Étant donné que le compilateur sait que la seule façon de réussir que cette conversion pourrait éventuellement réussir, c'est si u est bool, mais u peut être n'importe quoi! Le compilateur suppose que la plupart du temps u ne sera pas construit avec bool , et donc ce code est presque certainement une erreur et le compilateur porte ce fait à votre attention.

(substitut t pour u et chaîne pour bool ...)


5 commentaires

comme serait-il le meilleur choix ici?


@SteveczEtty: Nous ne savons pas que t est un type nullable, donc comme ne fonctionnerait pas (IIRC).


Bon point. Bien que je ne pense pas que est fonctionnera soit, sauf si t est contraint à une classe . (IIRC, aussi)


@Steveczetty: Oui, vous pouvez utiliser est avec n'importe quel type de type. Par exemple: objet O = 10; Si (O est INT) ...


@BehnamesMaili: Où est le type de valeur qui serait en boîte?



0
votes

Essayez de convertir en objet avant de convertir sur t xxx


0 commentaires

0
votes
public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

0 commentaires