2016-12-07 8 views
1

Я изучаю C# и сталкивался с ошибкой. Все мои методы являются общедоступными. Я подражаю коду из книги, в которой говорится: «Предположим, вы определили класс Vector и этот вектор является ссылочным типом и имеет переменную int member, называемую Value:», и она продолжается с кодом Program.cs (который я скопировал) , Поэтому я попытался подражать этому классу Vector, и когда я собираюсь скомпилировать его, он говорит, что Vector.Value недоступен из-за его уровня защиты.Vector.Value недоступен из-за его уровня защиты

Program.cs:

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      x.Value = 30; 
      Console.WriteLine(y.Value); 
      y.Value = 50; 
      Console.WriteLine(x.Value); 
     } 
    } 
} 

Vector.cs:

namespace ReferenceType 
{ 
    public class Vector 
    { 
     private int Value; 

     public int GetterSetter{ 
      get { return Value; } 
      set { Value = value; } 
     } 
    } 
} 
+1

Где сделал 'GetterSetter' родом из? Почему вы объявляете 'Value' как приватную? Ни одна из этих вещей не упоминается в вашей цитате «Предположите:». –

+0

Вы создали свойство 'GetterSetter' вместо' Value' и личное поле поддержки с именем 'Value'. Я не думаю, что это то, что ты хотел сделать. Возможно, вы хотели написать 'public int Value {get; set;}' или 'int _value; public int Значение {get {return _value;} set {_value = значение}}; '? –

+1

Свойства в .NET - это не только геттер/сеттеры. Они значительны и являются частью интерфейса класса. Они отображаются отдельно в метаданных, становятся сериализованными/десериализованными, сопоставляются с таблицами базы данных и т. Д. Поле поддержки - это всего лишь деталь реализации. –

ответ

3

Вы пытаетесь получить доступ к private член класса Vector, но у вас есть public свойство, которое обнажает private поле Value , это следует использовать вместо этого.

попробуйте этот код,

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      // Assign integer value to our public property "GetterSetter" 
      x.GetterSetter= 30; 
      // Access value of "Value" via "GetterSetter" property 
      Console.WriteLine(x.GetterSetter); 
      y.GetterSetter= 50; 
      Console.WriteLine(y.GetterSetter); 
     } 
    } 
} 

Обновление было бы лучше, чтобы изменить коды к этой

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      x.Value = 30; 
      Console.WriteLine(x.Value); 
      y.Value = 50; 
      Console.WriteLine(y.Value); 
     } 
    } 
} 


//Vector.cs 
using System; 

namespace ReferenceType 
{ 
    public class Vector 
    { 
     private int _value; 

     public int Value{ 
      get { return _value; } 
      set { _value = value; } 
     } 
    } 
} 

Вы можете прочитать на Access Модификаторы здесь msdn.microsoft.com/en-us/library/wxh6fsc7.aspx

+2

Объяснение этому: вы пытаетесь получить доступ к 'private' члену вне класса, вы должны фактически получить доступ к' GetterSetter', который предоставляет поле 'private'' Value', а также является свойством 'public'. – ColinM

+0

@ColinM Я бы не дал свой ответ так просто, как в первом опубликовании :) – gmetax

+0

Большое спасибо ... это имеет смысл. Что меня отбросило, в книге говорится, что x.Value = 30; // Значение - это поле, определенное в классе Vector – juice

Смежные вопросы