имена членов не могут совпадать с их включающим типом C #

81

Приведенный ниже код написан на C #, и я использую 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");
        }
    }
}

Когда я компилирую приведенный выше код, я получаю эту ошибку:

Ошибка: "Поток": имена элементов не могут совпадать с их включающим типом

Почему? Как я могу это решить?

ШРИ
источник

Ответы:

127

Имена методов, совпадающие с именем класса, называются конструкторами . Конструкторы не имеют возвращаемого типа. Так правильно, как:

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

Или переименуйте функцию как:

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

Хотя для меня весь код не имеет никакого смысла.

mshsayem
источник
2
Но откуда берутся (значения) xи yоткуда?
Хенк Холтерман
2
Обратите внимание, что эта ошибка также может произойти, если по ошибке ваше имя класса и ваше имя xaml совпадают. Со мной случилось сегодня.
NewBie1234 03
27

Проблема в методе:

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

Ваш класс назван, Flowпоэтому этот метод также нельзя назвать Flow. Вам нужно будет изменить имя Flowметода на другое, чтобы этот код скомпилировался.

Или вы хотели создать частный конструктор для инициализации вашего класса? В этом случае вам придется удалить voidключевое слово, чтобы компилятор знал, что вы объявляете конструктор.

Воутер де Корт
источник
6

Конструкторы не возвращают тип, просто удалите возвращаемый тип, который в вашем случае недействителен. Тогда все будет нормально.

Касим Хан
источник
4

Поскольку конструктор должен быть в начале класса, вы столкнулись с вышеуказанной проблемой. Итак, вы можете изменить имя или, если хотите использовать его в качестве конструктора, просто скопируйте метод в начале класса.

Кундж Сангани
источник
3

просто удалите это, потому что конструктор не имеет типа возврата, такого как void, он будет таким:

private Flow()
    {
        X = x;
        Y = y;
    }  
Хоби
источник
2

Конструктор не должен иметь возвращаемого типа. удалите void перед каждым конструктором.

Некоторые базовые характеристики конструктора:

а. То же имя, что и у класса b. нет возвращаемого типа. c. будет вызываться каждый раз, когда с помощью класса создается объект. например, в вашей программе, если вы создали два объекта Flow, Flow flow1 = new Flow (); Flow flow2 = новый Flow (); тогда конструктор Flow будет вызван 2 раза.

d. Если вы хотите вызвать конструктор только один раз, объявите его как static (статический конструктор) и не забудьте удалить любой модификатор доступа из статического конструктора.

Субхраншу
источник