Ошибки CS0116 и CS0246

#c#

#c# #пространства имен

Вопрос:

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

/p1/room.cs(1,7): ошибка CS0116: пространство имен не может напрямую содержать такие элементы, как поля или методы

/p1/room.cs(48,19): предупреждение CS0108: «Комната.GetType() ‘скрывает унаследованный объект-член’.GetType()’. Используйте ключевое слово new, если предполагалось скрытие.

/p1/room.cs(1,1): ошибка CS0246: не удалось найти тип или имя пространства имен «Using» (вам не хватает директивы using или ссылки на сборку?)

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

Вот мой файл room.cs

 Using System;

namespace p1
{
    public class Room
    {
       private string type;
       private double length;
       private double width;
       private double height;

       public Room()
       {
            type = "Default";
            length = 0.0;
            width = 0.0;
            height = 0.0;
       }

       public Room(string t, double l, double w, double h)
       {
            type = t;
            length = l;
            width = w;
            height = h;
       }


       public void SetType(string t)
       {
            type = t;
       }

       public void SetLength(double l)
       {
            length = l;
       }
       public void SetWidth(double w)
       {
            width = w;
       }
       public void SetHeight(double h)
       {
            height = h;
       }
       public string GetType()
       {
            return type;
       }
       public double GetLength()
       {
            return length;
       }
       public double GetWidth()
       {
            return width;
       }
       public double GetHeight()
       {
            return height;
       }


       public double GetArea()
       {
            return length*width;
       }
       public double GetVolume()
       {
            return length*width*height;
       }
       public void Display()
       {
            Console.WriteLine("Room Type: "   this.GetType());
            Console.WriteLine("Room Length: "   this.GetLength());
            Console.WriteLine("Room Width: "   this.GetWidth());
            Console.WriteLine("Room Height: "   this.GetHeight());
            Console.WriteLine("Room Area: "   this.GetArea().ToString("F 2")   " sq ft " );
            Console.WriteLine("Room Volume: "   this.GetVolume().ToString("F 2")   " cu ft ");
       }
   }
}
  

При необходимости я также могу опубликовать файл program.cs, но это становилось довольно длинным, и я не хотел, чтобы он был нечитаемым.

Комментарии:

1. Измените Using на using и посмотрите, не исправит ли это остальные ошибки.

2. Я бы также изменил все пары методов getXXX / setXXX на свойства, чтобы это больше походило на C #, чем на Java, и избавлялось от предупреждения на GetType .

3. GetType уже определено в Object. Каждый класс наследуется от Object в C# . Вам нужно либо override это сделать, либо подумать о лучшем названии.

4. @ChristianGollhardt Это не так, virtual поэтому вы не можете переопределить это. Я не думаю, что скрывать это здесь проблема, поскольку способы использования сильно отличаются, но использование свойств вместо этого устранило бы ошибку и стало бы чище.

5. Использование u в нижнем регистре исправило две ошибки. Я пошел простым путем и просто изменил GetType на что-то другое, и все пошло лучше. Большое спасибо!

Ответ №1:

Правильный синтаксис для использования пространства имен должен быть using, а не Using

Заменить Using System; на using System;

Использовать

 public new string GetType()
{
    return type;
}
  

вместо того, чтобы избавиться от предупреждения «Использовать новое ключевое слово, скрывается намерение»

 public string GetType()
{
    return type;
}
  

Комментарии:

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

2. Если это единственная проблема, то вопрос следует закрыть как опечатку.

3. Это не только опечатка, это также объясняет предупреждение о скрытии базовых функций. Но да, ответ должен быть немного более объяснен, чтобы быть хорошим.

Ответ №2:

В дополнение к тому, что уже сказал вивек нуна, вам следует привыкнуть к концепции свойств C #. Это сделает ваш код менее подробным и позволит избежать конкретной проблемы сокрытия GetType() :

 public class Room
{
   public string Type { get; set; } = "Default"; // with C#6 property initialization
   public double Length { get; set; }
   public double Width { get; set; }
   public double Height { get; set; }

   public Room() {} // no code here, Type is initalized, double is 0 by default

   public Room(string t, double l, double w, double h)
   {
        Type = t;
        Length = l;
        Width = w;
        Height = h;
   }

   public double GetArea()
   {
        return Length * Width;
   }
   public double GetVolume()
   {
        return Length * Width * Height;
   }
   public void Display()
   {
        Console.WriteLine("Room Type: "   Type);
        Console.WriteLine("Room Length: "   Length);
        Console.WriteLine("Room Width: "   Width);
        Console.WriteLine("Room Height: "   Height);
        Console.WriteLine("Room Area: "   GetArea().ToString("F 2")   " sq ft " );
        Console.WriteLine("Room Volume: "   GetVolume().ToString("F 2")   " cu ft ");
    }
}
  

Теперь извне вы можете просто получить доступ к свойствам:

 Room r = new Room();
r.Height = 12;
Console.WriteLine(r.Height);
  

Компилятор выполняет всю работу, которую вы проделали самостоятельно в своем коде. Он создает резервные поля для каждого свойства и методов getter и setter. Вам не обязательно этого делать, и вы можете сосредоточиться на реальной работе.

Комментарии:

1. Еще лучше, он может сделать Room r = new Room{ Height = 12 };