9
votes

"champ" mais est utilisé comme un "type"

Je reçois un message d'erreur que je ne peux pas sembler comprendre. Je vois qu'il y a beaucoup d'autres questions similaires publiées, mais les solutions ne semblent pas fonctionner pour moi.

Message d'erreur: p> xxx pré>

My Code: P >

"'PaymentPlanLogic.Logger.createLog()' is a 'method' but is used like a 'type'"


2 commentaires

Si vous n'avez pas ce code dans la classe1 à l'intérieur d'un constructeur? La première ligne créera un membre privé de votre classe, mais la deuxième ligne n'a aucun sens et que vous obtenez cette erreur.


S'il s'agit de votre code complet, je suggère de regarder quelques C # Tutorial Sites .


3 Réponses :


23
votes

Vous ne pouvez pas appeler une méthode sur un champ en dehors d'une méthode: xxx


3 commentaires

Youforgotthismethod est probablement le constructeur qui manque (je pense).


@ ken2k oui vous avez probablement raison, ne doit pas être dans un constructeur, alors j'ai donné la réponse générale


Merci, je savais que je faisais quelque chose de stupide.



2
votes

La définition de classe1 est incomplète. Vous ne pouvez pas appeler cette méthode dans la classe, vous pouvez l'appeler dans une méthode de la classe: xxx

puis créatelog () exécuterait lors de l'instanciation d'une nouvelle instance de Classe1.


0 commentaires

15
votes

La réponse de Tobsey est correcte. La raison du message d'erreur étrange est que le compilateur essaie désespérément de comprendre ce que vous voulez dire. Le raisonnement va comme ça:

Les seules choses qui sont légales à ce stade sont des déclarations de classes, d'interfaces, de structures, d'enums, de champs, d'opérateurs, d'indexeurs, d'événements, de propriétés, de méthodes, de constructeurs et de destructeurs. Il ne peut pas être une classe, une interface, une structure ou un énumé parce que tous ont tous un mot-clé. Il ne peut pas être un constructeur ou destructeur. Par conséquent, l'utilisateur doit tenter de créer un champ, un opérateur, une indexer, un événement, une propriété ou une méthode. Toutes ces choses peuvent commencer légalement avec un type. OK, cette expression doit donc tenter d'identifier un type. Mais cela n'identifie pas un type; Il identifie un champ. Donc c'est l'erreur que je vais donner.

Bien sûr, c'est une anthropomorphisation injustifiée du compilateur, mais vous prenez le point: le "modèle mental" du compilateur de code erroné est très différent de ce que vous pensais lorsque vous avez écrit le code brisé, et le message d'erreur est donc pas très utile. Le compilateur pense que vous savez que vous savez qu'une déclaration ne peut pas y aller et avoir mélangé un champ avec un type. Un algorithme plus sophistiqué aurait le compilateur deviner que depuis ce que vous avez saisi est une déclaration légale. , que l'erreur réelle est que la déclaration est en dehors d'un bloc.

Écriture des générateurs de messages d'erreur qui modéliser avec précision les processus mentaux des personnes qui écrivent du code brisé sont assez difficiles.


0 commentaires