10
votes

Problème de mots-clés dynamique

pls me dire dans quelle version du mot clé dynamique est introduit? J'ai trouvé un comportement étrange dans VS2010. J'ai défini le cadre cible sur 3.5. Mais il n'y a pas d'erreur de compilateur. Juste creille une application de console avec cadre cible à .NET 3.5 et utiliser le mot-clé dynamique.


0 commentaires

4 Réponses :


14
votes

Le type dynamique a été introduit dans .NET 4.0.

Le type dynamique n'est pas une fonction de langue uniquement (c'est purement supporté par le compilateur). Il repose sur le DLR qui est une fonctionnalité .NET 4.0 qui nécessite un support de bibliothèque.

Vous ne pouvez pas utiliser dynamique et cibler le cadre .NET 3.5.


7 commentaires

Mais pourquoi il n'y a pas d'erreur de compilateur pour 3.5 Application dans VS 2010


@saokat, vous devez avoir un cerveau pet - vous ne pouvez pas utiliser dynamique avec .NET 3.5. Veuillez vérifier vos paramètres et essayer de compiler à nouveau.


@chibacité, je sais que je ne peux pas utiliser dynamique en 3.5. Mais essayez-vous vous-même. Même je définit prise en chargeRuntime dans le fichier de configuration. Il n'y a pas d'erreur d'exécution.


@saokat Après avoir posté, je me suis essayé juste de m'assurer que je n'imaginais pas les choses - au moins sur ce point je ne suis pas. Je l'ai essayé - il ne compile pas en 3.5.


@chibacité, utilisez-vous VS 2010 ou VS2008.


@saokat j'ai vs2010 et vs2008. J'ai répété dans VS2010.


Comme je l'ai dit dans la réponse acceptée, c'est la bonne réponse; La réponse acceptée est incorrecte, car le compilateur donne une erreur.



10
votes

Le mot clé dynamique a été introduit dans le cadre de la langue C # 4.0 - Le compilateur est livré avec VS 2010. Son fonctionnalité linguistique et n'a pas besoin d'un support d'exécution (AFAIK), une fois satisfait du compilateur C # 4.0, ne devrait avoir aucun problème avec plus tôt. version de l'exécution. Changer le cadre cible dans VS 2010 ne change pas le compilateur (qui reste à 4.0) - nous recevrons une erreur de compilateur uniquement si vous utilisez une fonctionnalité qui cible la nouvelle bibliothèque ou le temps d'exécution. Par exemple, dans VS 2008, vous pouvez utiliser des expressions Lambda ou un mot-clé Var pour la cible d'exécution 2.0 mais des méthodes d'extension n'étaient pas disponibles car l'attribut d'extension faisait partie de l'assemblage 3.5.

EDIT: ci-dessus est incorrect - le mot clé dynamique nécessite un cadre de clé 4.0. Je ne pouvais même pas compiler dans VS2010 lorsque la cible FX a été modifiée en 3.5. Je pense que l'OP n'aurait peut-être pas utilisé la variation dynamique plus tard dans le code de sorte que l'optimisation du compilateur aurait supprimé cela rendrait l'OP croire que son travail.


6 commentaires

Le type dynamique n'est pas une fonctionnalité de langue uniquement, elle est prise en charge par le DLR qui est .NET 4.


@chibacité, je n'aurais mais malheureusement pas vs 2010 sur la machine actuelle. Vous avez probablement raison de dire que la dépendance DLR est nécessaire pour que la dynamique fonctionne - je croyais autrement, car Saokat est en mesure de l'utiliser avec FX 3.5.


Comme la chibacité a dit, je ne pense pas que cela fonctionne, car une bibliothèque spécifique est nécessaire pour appeler de manière dynamique des méthodes qui ne sont pas disponibles sans .NET 4.0.


@Lambert pls vérifier en vs2010


Cette réponse semble être incorrecte ... @saokat: ce code: dynamique x = 10; x.tostring (); donne: programme.cs (12,4): Erreur CS1969: Un ou plusieurs types requis pour compiler une expression dynamique ne peut pas être trouvé. Vous manquez des références à Microsoft.csharp.dll et à System.core.dll?


@saokat, la chibacité est absolument correcte! Je ne pouvais même pas compiler dans VS2010 lorsque la cible FX a été modifiée en 3.5. Pouvez-vous partager votre code qui fonctionne - je pense que vous n'auriez peut-être pas utilisé la variation dynamique plus tard dans votre code, de sorte que l'optimisation du compilateur aurait supprimé cela vous permettant de penser que son travail. Essayez d'imprimer votre dynamique et vous devriez voir le problème.



11
votes

Lorsque vous utilisez Visual Studio 2010 , il est par défaut sur C # 4.0 .

Vous ne pouvez pas utiliser C # 3.0 avec Visual Studio 2010 .

Même si vous cible .NET Framework 3.5 , il utilisera simplement Framework 3.5 et non c # 3.0 . .

Maintenant, car il est par défaut sur C # 4.0 , vous pouvez utiliser dynamique . Mais pour que cela fonctionne, vous devez référencer microsoft.cshaarp.dll . Cet assemblage est compilé avec V 4.0 . Vous ne pouvez pas l'utiliser sous V 3.5 .

dynamique Besoins DLR (Dynamic Language Runtime) Ce qui n'est pas là pour les versions de cadre précédent.

C'est pourquoi, lorsque vous essayez d'utiliser dynamique sous Cadre 3.5 , il va paniquer.

Donc, pour résumer, utiliser dynamique , utiliser framework 4.0 .


5 commentaires

Il n'y a pas de "C # 3.5". C # 3.0 a été introduit avec .NET 3.5.


Pourquoi est-ce voté à la fois? Le point principal est que vous avez besoin microsoft.csharp.dll , ce qui est vrai. +1


Etienne, 3.0 n'a pas été libéré comme un cadre tel que 2.0 / 3.5, il a été libéré de coïncider avec la libération de Windows Vista, car le cadre n'était pas complet à 100% à l'époque, 3,0 expédiés avec Vista, quand il était prêt a été nommé 3.5. (AUTANT QUE JE SACHE)


@Phill Il n'y avait jamais eu de C # 3.5.


@chibacité - Re-Lit sur je pensais que c'était faisant référence à .NET Framework, pas c #. Ma faute.



1
votes

Juste pour le bien de la connaissance: Cette technique s'appelle «polymorphisme par la liaison tardive»

elle a été introduite dans .NET Framework 1.1. C # a acquis cette fonctionnalité dans la version 4.0. Dans Visual Basic, il a été possible de démarrer ces erreurs de compilation avecoud. xxx

`

tout l'astuce est dans laquelle le type" objet "a joué le rôle" objet " du parent de niveau supérieur ainsi que d'une variable dynamique


0 commentaires