nazwy członków nie mogą być takie same jak ich typ otaczający C #


81

Poniższy kod jest w C # i używam 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");
        }
    }
}

Kiedy kompiluję powyższy kod, pojawia się ten błąd:

Błąd: „Przepływ”: nazwy członków nie mogą być takie same jak ich typ obejmujący

Czemu? Jak mogę to rozwiązać?

Odpowiedzi:


127

Nazwy metod, które są takie same jak nazwa klasy, nazywane są konstruktorami . Konstruktory nie mają typu zwracanego. Tak poprawne, jak:

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

Lub zmień nazwę funkcji na:

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

Chociaż cały kod nie ma dla mnie żadnego sensu.


2
Ale skąd (wartości) xi yskąd pochodzą?
Henk Holterman,

2
Zwróć uwagę, że ten błąd może się również zdarzyć, jeśli przez pomyłkę nazwa klasy i nazwa XAML są takie same. Przydarzyło mi się dzisiaj.
NewBie1234

27

Problem dotyczy metody:

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

Twoja klasa ma nazwę, Flowwięc tej metody nie można również nazwać Flow. Będziesz musiał zmienić nazwę Flowmetody na inną, aby ten kod się skompilował.

A może chodziło Ci o utworzenie prywatnego konstruktora do zainicjowania Twojej klasy? W takim przypadku będziesz musiał usunąć voidsłowo kluczowe, aby kompilator wiedział, że deklarujesz konstruktor.


6

Konstruktory nie zwracają typu, po prostu usuwają typ zwracany, który w twoim przypadku jest nieważny. Wtedy będzie działać dobrze.


4

Ponieważ Konstruktor powinien być na początku klasy, masz do czynienia z powyższym problemem. Możesz więc zmienić nazwę lub jeśli chcesz użyć jej jako konstruktora, po prostu skopiuj metodę na początku klasy.


3

po prostu usuń to, ponieważ konstruktor nie ma typu zwracanego, takiego jak void, będzie wyglądał tak:

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

2

Konstruktor nie powinien mieć zwracanego typu. usuń void przed każdym konstruktorem.

Kilka bardzo podstawowych cech konstruktora:

za. Taka sama nazwa jak klasa b. brak typu zwrotu. do. będzie wywoływana za każdym razem, gdy obiekt zostanie utworzony z klasą. na przykład - w programie, jeśli uczyniliśmy dwa obiekty Flow, Flow flow1 = new Flow (); Flow flow2 = new Flow (); następnie konstruktor Flow zostanie wywołany 2 razy.

re. Jeśli chcesz wywołać konstruktor tylko raz, zadeklaruj go jako statyczny (konstruktor statyczny) i nie zapomnij usunąć dowolnego modyfikatora dostępu z konstruktora statycznego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.