2009-10-03 10 views

Répondre

5

Fondamentalement, cette expression est équivalente à

new { name = name } 

puisqu'aucun nom de la propriété explicite est fourni.

Le compilateur C# génère une classe au moment de la compilation avec une propriété name. Il déduit le nom de la propriété du nom de la variable (qu'il voit évidemment). Tout est saisi statiquement au moment de la compilation. Rien de spécial n'est exécuté lors de l'exécution (sauf l'initialisation de l'instance de classe anonyme). Aucune méthode n'est appelée sur quoi que ce soit.

+0

OK. Ça a du sens. Je rendais la chose plus compliquée dans ma tête, même si je savais que c'était fait au moment de la compilation. Je suppose que ma vraie question était de savoir quelle est la meilleure façon d'obtenir le nom d'une variable et je me suis dit que c'était le meilleur moyen pour le compilateur. –

+0

Ce qui n'est évidemment pas directement traduisible en C# :) –

+1

Vous pouvez voir comment Mehrdad est juste à partir de ce que le compilateur se plaint lorsque vous faites 'object obj = new {" Foo "};'. Il ne peut déduire aucun nom de ce que vous avez utilisé. 'object obj = new {name =" Foo "};' fonctionne bien à nouveau. – Joren

5

Si votre question est "comment puis-je obtenir le nom d'une variable?" (comme vous l'avez mentionné dans votre commentaire ci-dessus), alors c'est la mauvaise question à poser, car cela n'obtient pas le nom d'une variable en premier lieu. Un initialiseur de projection n'a pas besoin d'être une variable du tout. Tout ce qu'il doit être est soit un identifiant, soit une expression suivie d'une période suivie d'un identifiant. Le nom utilisé par l'initialiseur de projection est l'identifiant.

Si votre question est réellement "comment puis-je obtenir le nom d'une variable?" la réponse est "vous n'avez pas, parce que les variables n'ont pas nécessairement des noms uniques". Une variable peut avoir zéro, un ou plusieurs noms qui lui sont associés, et ces noms ne sont connus qu'au moment de la compilation (ou par le débogueur qui consomme des informations émises par le compilateur); les noms n'existent pas à l'exécution.

Questions connexes