Mitgliedsnamen dürfen nicht mit dem umschließenden Typ C # identisch sein


81

Der folgende Code ist in C # und ich verwende Visual Studio 2010.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace FrontEnd
{
    class Flow
    {
        long i;
        private int x,y;
        public int X
        {
            get;set;
        }
        public int Y
        {
            get;set;
        }

        private void Flow()
        {
            X = x;
            Y = y;
        }

        public void NaturalNumbers(int x, int y)
        {
            for (i = 0; i < 9999; i++)
            {
                Console.WriteLine(i);
            }
            MessageBox.Show("done");
        }
    }
}

Wenn ich den obigen Code kompiliere, erhalte ich folgende Fehlermeldung:

Fehler: 'Flow': Mitgliedsnamen dürfen nicht mit ihrem umschließenden Typ identisch sein

Warum? Wie kann ich das beheben?

Antworten:


127

Methodennamen, die mit dem Klassennamen identisch sind, werden als Konstruktoren bezeichnet . Konstruktoren haben keinen Rückgabetyp. So richtig wie:

private Flow()
{
   X = x;
   Y = y;
}

Oder benennen Sie die Funktion um in:

private void DoFlow()
{
   X = x;
   Y = y;
}

Obwohl der ganze Code für mich keinen Sinn ergibt.


2
Aber woher kommen (die Werte von) xund woher y?
Henk Holterman

2
Beachten Sie, dass dieser Fehler auch auftreten kann, wenn versehentlich Ihr Klassenname und Ihr xaml-Name identisch sind. Ist mir heute passiert.
NewBie1234

27

Das Problem ist mit der Methode:

private void Flow()
{
    X = x;
    Y = y;
}

Ihre Klasse heißt, Flowdaher kann diese Methode nicht auch benannt werden Flow. Sie müssen den Namen der FlowMethode in einen anderen Namen ändern , damit dieser Code kompiliert wird.

Oder wollten Sie einen privaten Konstruktor erstellen, um Ihre Klasse zu initialisieren? In diesem Fall müssen Sie das voidSchlüsselwort entfernen , um den Compiler darüber zu informieren, dass Sie einen Konstruktor deklarieren.


6

Konstruktoren geben keinen Typ zurück, sondern entfernen nur den in Ihrem Fall ungültigen Rückgabetyp. Dann würde es gut laufen.


4

Da sich der Konstruktor am Anfang der Klasse befinden sollte, stehen Sie vor dem oben genannten Problem. Sie können also entweder den Namen ändern oder die Methode am Anfang der Klasse kopieren, wenn Sie sie als Konstruktor verwenden möchten.


3

Entfernen Sie dies einfach, da der Konstruktor keinen Rückgabetyp wie void hat. Er sieht folgendermaßen aus:

private Flow()
    {
        X = x;
        Y = y;
    }  

2

Ein Konstruktor sollte keinen Rückgabetyp haben. Entfernen Sie die Leere vor jedem Konstruktor.

Einige sehr grundlegende Merkmale eines Konstruktors:

ein. Gleicher Name wie Klasse b. Kein Rückgabetyp. c. wird jedes Mal aufgerufen, wenn ein Objekt mit der Klasse erstellt wird. Wenn Sie beispielsweise in Ihrem Programm zwei Objekte von Flow erstellt haben, ist Flow flow1 = new Flow (). Flow flow2 = neuer Flow (); dann wird der Flow-Konstruktor zweimal aufgerufen.

d. Wenn Sie den Konstruktor nur einmal aufrufen möchten, deklarieren Sie dies als statisch (statischer Konstruktor) und vergessen Sie nicht, Zugriffsmodifikatoren aus dem statischen Konstruktor zu entfernen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.