9
votes

Un lieu de classe / champ peut-il être de type anonyme en C # 4.0?

comme dans: xxx

Remarque: Ce qui précède ne compile ni fonctionne (le var ne peut pas y être utilisé), il est seulement de montrer mon point.

MISE À JOUR : Juste pour clarifier la question, j'avais déjà essayé d'utiliser xxx

et cela fonctionne, mais cela ne génère pas IntelliSense à cause de la dynamique dactylographie. Je suis conscient que la dactylographie anonyme est juste un tour de compilateur, j'ai donc espéré que je pouvais utiliser ce truc à mon avantage en déclarant un champ structuré sans avoir à déclarer une classe à l'avance (principalement parce qu'il n'y a qu'une seule instance de ce genre particulier de ce genre particulier de champ). Je peux voir maintenant que ce n'est pas possible, mais je ne sais pas pourquoi c'est. Si le compilateur générant simplement un type implicite d'un objet anonyme, il devrait être assez simplement d'avoir le compilateur générer ce type implicite pour un champ.


4 commentaires

MyProp n'est pas une propriété, c'est un champ.


@Greg: là, je l'ai réparé pour Diego (et vous): p


@Andrew - Je me sens tellement soulagée, merci!


@Greg mon mauvais, merci pour la correction


7 Réponses :


12
votes

On dirait que vous pouviez poser une ou deux questions afin que je vais essayer de les résoudre tous les deux.

Un champ de classe peut être fortement saisi à un type anonyme < p> non. Les noms de type anonyme ne peuvent pas être indiqués dans C # Code (par conséquent anonyme). Le seul moyen de les taper staticiquement est

  1. Type générique Inferencee
  2. Utilisation du mot clé

    aucun de ceux-ci n'est applicable au champ d'un type.

    Un champ de classe peut être initialisé avec une expression de type anonyme?

    oui. Le champ doit simplement être déclaré à un type compatible avec les types anonymes: objet par exemple xxx


9 commentaires

Euh ... donc la réponse n'est donc pas "oui", mais "non"?


@Adam la réponse est la question est ambiguë :) Je vais essayer de faire ma réponse moins


Oui ... Les deux objets et dynamiques ne donnent pas un membre anonyme. Alors la réponse devrait être non.


Curieuse; Si vous attribuez un type anonyme à un objet , comment le jettez-vous pour obtenir le type réel?


@Abhishek: objet est certainement un type.


@Adam, désolé, j'ai écrit à tort cela. Je voulais dire autre chose. Tellement édité.


Je pense que vous pourriez aller pour votre objet ou dynamique, mais dans les deux cas, vous devez utiliser la réflexion car le type vous manque.


Si vous utilisez l'objet comme type de champ, vous perdez toute possibilité d'accéder aux 2 propriétés de ce type sans réflexion (qui défait l'entier de cela)


@Diego, quand j'ai lu la question, je ne pouvais pas dire quel scénario vous aviez et essayé d'offrir la réponse la plus complète. Il y a des astuces que la réflexion pour obtenir des types de types anonymes de objet mais ils sont hacky IMHO. Donc, oui, cela rend l'objet surtout moins que utile. Si vous avez besoin d'un champ, le meilleur chemin est d'utiliser un type défini ou un tuple.



5
votes

Non, aucun membre doit être fortement saisi.

Vous pourriez aller pour un type dynamique pour donner à votre membre une chance d'être évalué au moment de l'exécution.

Edit: Les membres doivent être explicitement dactylographiés.


2 commentaires

Var est fortement typé. Je pense que vous ce que vous voulez dire est "explicitement tapé".


@Mark Oui, Var ne peut pas être utilisé comme membre d'une classe.



0
votes

Non, les types anonymes ne peuvent être exposés en dehors de leur fonction de déclaration comme autre chose que objet . Bien que le type anonyme ne soit que du sucre syntaxique et que, en fait, crée un type de béton, ce type n'est jamais connu (ni disponible) au développeur et ne peut donc pas être utilisé.


2 commentaires

Vous dites "jamais connu" et "ne peut pas être utilisé", mais n'est-ce pas en train d'actualiser la réflexion et dynamique ? (Pas que j'encourage la pratique, l'esprit.)


@Antthony: Non, aucun de ceux qui ne permettent au développeur (comme dans, la personne qui écrit le code) de "savoir" le type. Vous pouvez certainement appeler gettype () sur l'objet, mais c'est une opération d'exécution uniquement. NOR est dynamique une solution.



2
votes

Si ceci est C # 4, examinez le mot-clé dynamique. XXX

Cependant, dès que vous le faites, vous perdez une sorte de vérification de type de sécurité et de compilateur pratique.


1 commentaires

C'est ce que j'ai fait, mais j'ai perdu l'intellensense sur les propriétés de l'objet. J'aimerais le faire pour que Intellisense puisse aider les gens à utiliser ma classe.



3
votes

Que diriez-vous d'utiliser tuple Code> à la place?

public class MyClass {

  private static Tuple<string, string> MyProp = Tuple.Create("a", "b");

}


4 commentaires

J'étais sur le point de fournir ce bloc de code exact moi-même. Explicitement statiquement dactylographié et vous n'avez pas à construire manuellement un nouveau type. J'espère vraiment que cela devienne upémenté devant ces solutions stupides "dynamiques".


Bien sûr, maintenant que votre réponse a été snipée qui est probablement peu probable.


Hehe, oh bien. Ce n'est pas nécessairement clair de toute façon la question de savoir qu'une tuple serait une bonne solution. Le code exemple n'a que champs "item1" et "item2", mais peut-être que le code réel a plus de noms logiques, qui seraient perdus en utilisant un tuple. Comme il s'agit d'un domaine privé, un tuple est probablement correct, mais s'il s'agissait d'un domaine public, je dirais probablement une meilleure idée est de définir un type spécifique pour stocker ces données, même s'il est un peu plus codant.


Exactement, l'idée est d'avoir un champ constant statique structuré et pourrait avoir plusieurs niveaux de composants anonymes nicheurs.



1
votes

Une propriété (ou un champ) de une classe nommée ne peut pas avoir de type anonyme, car un tel type ne peut pas être mentionné en code. Cependant, , un type anonyme peut contenir les propriétés du type anonyme: xxx

mais une telle construction n'a pas d'usage pratique en dehors de la portée locale. ..


0 commentaires

6
votes

en C # 7, vous pouvez enfin faire ceci:

private (string Login, string Password) _credentials = (Login: "123", Password: "123");


0 commentaires