7
votes

Échec de distribution explicite générique C #

J'ai des problèmes avec la pièce de code suivante. Je voudrais expliciter une chaîne à un objet, cela fonctionne parfaitement bien, si cet objet fait partie d'une classe générique, cela échoue à l'exception d'erreur suivante: "Impossible de lancer l'objet de type" System.string " tapez 'test.b' ". Même si j'ai surchargé la méthode. XXX

Il serait génial si SOMONE pourrait m'expliquer pourquoi cela ne coule pas correctement. Merci


0 commentaires

4 Réponses :


1
votes

C'est parce que t pour a ne connaît pas les opérateurs de distribution explicite pour B ou c .


0 commentaires

11
votes

Les opérateurs de conversion ne s'appliquent que lorsque le type est connu de manière statique; Après tout, les méthodes génériques doivent utiliser le le même IL pour chaque t - il ne peut donc pas appeler votre opérateur dans certains cas et un chèque de type dans d'autres.

En outre, parce que vous avez explicitement couler à objet , il sera jamais être utilisé; Un déclenchement de objet est toujours un simple contrôle de boîte de non-un ou de type.

Un correctif diabolique serait (et je n'aime pas ça): < / p> xxx

qui donne la résolution à l'exécution du temps d'exécution. Cela fonctionne, mais j'aurais besoin de me laver les yeux après cela. Plus généralement, bien que: les opérateurs et les génériques ne jouent pas bien - donc: essayez de ne pas utiliser cette combinaison dans votre API. Je vraiment n'utiliserait pas ce qui précède, personnellement!


1 commentaires

Merci pour votre réponse rapide sur ma question, je l'apprécie. Je vais atterrir pour trouver une approche différente comme après quelques recherches sur le type dynamique, je suis d'accord avec vous que ce n'est pas la meilleure approche, du tout. Merci encore.



2
votes

compilateur n'a aucune connaissance lors de la compilation si le paramètre générique a explicitement diffusé que vous utilisez.

Vous pouvez également introduire l'interface et mettre la contrainte sur le paramètre générique


4 commentaires

Vous ne pouvez pas mettre les opérateurs de conversion sur des interfaces, bien que


@Marc vous pouvez envelopper la conversion dans une méthode


pour "convertir en" méthodes, peut-être; "Convertir de" est plus délicieux (ce qui est dans la question) - vous devez créer une instance du type pour appeler la méthode qui crée des instances du type - A mais hucky


Eh bien, il n'y a définitivement aucun moyen de spécifier le constructeur autre que le paramètre sans paramètre dans la contrainte générique de paramètre, mais la combinaison de où T: imyinter, nouvelle () Les contraintes feront le tour.



2
votes

Vous avez inséré la mise en forme (objet) pour obtenir le compilateur pour arrêter de vous dire que vous vous trompiez mal. Cela a fonctionné, le compilateur ne peut plus se plaindre car cela l'empêchait de vérifier les types. Et un casting d'objet à t pourrait réellement fonctionner, aussi petit que les chances pourraient être.

Ce que vous n'avez cependant pas compté, c'est que les opérateurs de conversion explicite sont une fonctionnalité de langue C #. Seul le compilateur sait quelle méthode exécuter lorsqu'un tel casting est appliqué. C'est pas une fonctionnalité CLR, l'exécution ne va pas chasser et rassembler pour essayer de trouver une méthode applicable pour faire la conversion. Le compilateur C # est autrement impuissant à utiliser l'un des opérateurs que vous avez fournis au moment de la compilation, il ne connaît pas le type de t.

problème, le compilateur n'est plus là pour aider lorsque la distribution s'exécute. Kaboom.

Avoir des types génériques appliqués au moment de l'exécution au lieu de la compilation est une fonctionnalité .NET, le terme générique est "Générités de réifié". Contrairement à "Effacement de type", la manière dont les génériques sont implémentés dans Java et C ++. Le problème avec l'effacement de type est que toutes les informations sur les arguments de type générique sont perdues après la compilation du code, un type générique ne peut pas être utilisé par une autre langue et la réflexion ne fonctionne pas. Le problème avec les génériques de réifié est que les opérations qui ne peuvent pas être utilisées universellement à aucun type ne peuvent pas être utilisées. Comme opérateur + (). Et comme ce casting.


0 commentaires