імена членів не можуть збігатися з типом огородження типу 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");
        }
    }
}

Коли я компілюю наведений вище код, я отримую цю помилку:

Помилка: 'Flow': імена членів не можуть збігатися з типом, що їх включає

Чому? Як я можу це вирішити?

Відповіді:


127

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

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

Або перейменуйте функцію як:

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

Хоча весь код для мене не має ніякого сенсу.


2
Але звідки (значення) xі yпоходять?
Хенк Холтерман

2
Зверніть увагу, що ця помилка також може трапитися, якщо помилково ваше ім'я класу та ваше ім'я xaml однакові. Сталося зі мною сьогодні.
NewBie1234

27

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

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

Ваш клас названий, Flowтому цей метод також не може бути названий Flow. Вам доведеться змінити назву Flowметоду на щось інше, щоб зробити цей код компіляційним.

Або ви мали намір створити приватний конструктор для ініціалізації вашого класу? Якщо це так, вам доведеться видалити voidключове слово, щоб повідомити компілятор, що ви оголошуєте конструктор.


6

Конструктори не повертають тип, просто видаляють тип повернення, який є недійсним у вашому випадку. Тоді це добре працювало б.


4

Оскільки Конструктор повинен бути на початку класу, ви стикаєтесь із вищезазначеною проблемою. Отже, ви можете або змінити ім'я, або якщо ви хочете використовувати його як конструктор, просто скопіюйте метод на початку класу.


3

просто видаліть це, тому що конструктор не має типу повернення типу void, він буде таким:

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

2

Конструктор не повинен мати тип повернення. видалити void перед кожним конструктором.

Деякі дуже основні характеристики конструктора:

a. Те саме ім'я, що і клас b. тип повернення відсутній. c. буде викликатися кожного разу, коли об’єкт створюється разом із класом. наприклад, у вашій програмі, якщо ви зробили два об'єкти Flow, Flow flow1 = new Flow (); Потік потоку2 = новий потік (); тоді конструктор Flow буде викликатися 2 рази.

d. Якщо ви хочете викликати конструктор лише один раз, тоді оголосіть це як статичний (статичний конструктор) і не забудьте видалити будь-який модифікатор доступу зі статичного конструктора ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.