10
votes

Classe partielle avec la même méthode de nom

J'ai une classe partielle comme celle-ci xxx

Comment ces 2 classes fusionnent-elles au moment de la construction? Donnez-moi s'il vous plaît expliquer à ce sujet.


0 commentaires

8 Réponses :


7
votes

Il ne compile pas car vous ne pouvez pas avoir deux méthodes avec le même nom dans une classe.


7 commentaires

Si l'utilisateur 2Différent travaillant sur ces classes, ils peuvent faire cette erreur.Comment puis-je éviter cela.


@Pankaj: Faites-les parler les uns aux autres =)


@Pakaj - en ayant un bon système d'intégration continu qui ne leur permet pas de vérifier le code qui ne compilera pas.


@Jens - Ne soyez pas Daft, ce sont des développeurs. Peut-être postez-le donc, il y a de bonnes chances qu'ils puissent le voir ...


Ou n'utilisez pas une structure de classe partielle pour permettre à différents devs de travailler sur la même classe - faites-la en une seule classe - laissez votre source de contrôle gérer le problème (thats ce qu'ils font). Le premier à vérifier dans les victoires et la seconde doit fusionner des changements.


@Pankaj, je ne vois pas comment ce serait un problème que vous devez empêcher d'une manière ou d'une autre? Si le code ne compile pas, il ne compile pas. Il y a une million de raisons possibles pour lesquelles le code ne compile pas, c'est juste l'un d'entre eux (et un très rare que je n'ai jamais rencontré). Compiler les erreurs de temps ne devrait pas être beaucoup de problème car elles sont généralement faciles à réparer.


@Jens: c'est exactement ce que je pensais immédiatement à lire la question, puis j'ai fait défiler votre commentaire et j'ai vu votre commentaire :) @pankaj: Comme d'autres l'ont déjà dit, vous ne devriez pas vérifier dans le code qui n'a pas 't compiler. Même s'ils se détestent suffisamment de ne pas communiquer, dès que l'utilisateur 2 tire les changements d'utilisateur 1 et réalise que la construction est cassée, il doit le réparer avant de vérifier le sien. Je sais, je sais: "si seulement", hein? :)



2
votes

Outre les erreurs syntaxiques, votre code ne compilera pas. Vous obtiendrez l'erreur suivante:

type 'myNamespace.abc' définit déjà un membre appelé "godetage" avec les mêmes types de paramètres

C'est parce que le compilateur fusionnera toutes les parties d'une classe partielle en une seule classe comme Section 10.2 de la spécification de langue c # explique:

À l'exception des méthodes partielles (§10.2.7), l'ensemble des membres d'un type déclaré en plusieurs parties est simplement l'union de l'ensemble des membres déclarés dans chaque partie. Les corps de toutes les parties de la déclaration de type partagent le même espace de déclaration (§3.3) et la portée de chaque membre (§3.7) s'étend aux corps de toutes les pièces.

C # ne permet pas de disposer de méthodes avec les mêmes noms et avec le même numéro et les mêmes types d'arguments dans une seule classe. Ceci est indiqué dans la section 1.6.6 de la spécification:

La signature d'une méthode doit être unique dans la classe dans laquelle la méthode est déclarée. La signature d'une méthode consiste en le nom de la méthode, le nombre de paramètres de type et le nombre, les modificateurs et les types de ses paramètres. La signature d'une méthode n'inclut pas le type de retour.

Il y a une option cependant d'ajouter la déclaration d'une méthode dans une partie d'une classe partielle et de la mise en œuvre dans une autre: méthodes partielles . Vous pouvez en savoir plus sur eux dans l'article de blog d'Eric Lippert sur ce sujet:

Quelle est la différence entre une méthode partielle et une classe partielle?


0 commentaires

0
votes

Ils ne fusionnent pas: vous aurez une erreur de compilation.


0 commentaires

17
votes

Il y aura une erreur de temps compile lorsque vous essayez de compiler ce code!

Que se passe-t-il au moment de la construction est le compilateur combine tous les membres définis dans toutes les définitions partielles de la classe en une . Il essaiera alors de la compiler la manière habituelle.

Dans votre cas, il sera d'une erreur Mentionner Vous avez déjà défini une méthode avec le même nom . .


2 commentaires

Une mise en garde moderne - Ce code serait totalement fine si les classes partielles étaient divisées en 2 fichiers distincts pour 2 cibles de plate-forme distinctes dans une bibliothèque de classe standard multi-ciblée (à l'aide du système de projet "SDK" relativement neuf). Voici un Exemple réel de cela.


@Markzhukovsky, merci pour ce commentaire. Je cherche exactement le code source de .NET CORE runtimeInformation.dll ici: github.com/dotnet/runtime/tree/... et je vois la même propriété" OSDescription "implémentation dans 2 fichiers distincts, donc merci!



0
votes

Ils ne fusionneront pas: Compilez l'erreur de temps. Ils pourraient fusionner dans votre cas si vous les mettez accidentellement dans différents espaces de noms.


0 commentaires

0
votes

Le pré-processeur (ou compilateur peut-être) analyse votre dossier de projet lors de l'une de ses exécutions et vérifie les noms de classes situés dans un projet (ou un assemblage à préciser). Ensuite, il marque des classes partielles et vérifie s'il y a des définitions mouplées.
Demandez à Eric Lippert sur les détails. Il fusionne ensuite des méthodes, des commentaires, des attributs, des membres, des interfaces, etc. Avoir une lecture sur la spécification C # Lang. Vos méthodes n'ont pas de modfier partiel, alors que les gars avant de me remarquer, il ne compilera pas.


0 commentaires

1
votes

Les classes partielles sont fusionnées pendant la compilation. Les compilateurs recherchent les classes partielles et les intégrent tout en compilant. Il combine simplement des classes partielles "deux" en une seule classe. Il n'y a pas de modification effectuée dans le CLR pour la mise en œuvre de classes partielles. Vous pouvez le considérer comme la fusion de «deux» classes partielles.

Par exemple pour votre code, vous aurez: xxx

et cela vous donnera une erreur parce que vous Impossible de disposer de 2 méthodes avec le même nom et la même signature (voir getage méthode).


0 commentaires

0
votes

Essayez ceci: xxx

laissez le partial hors de la première classe!


1 commentaires

Ce code ne fonctionnera pas, donnera une erreur suivante: "Modificateur partiel manquant sur la déclaration de type" ABC "; une autre déclaration partielle de ce type existe"