В моем коде есть 3 класса (a, b, c), которые (b, c) наследуют классы a. и у меня есть список (список mylist). Моя проблема заключается в добавлении к элементу из класса b или класса c
public class A
{
public int x;
public int y;
public A(int x, int y)
{
this.x = x;
this.y = y;
}
}
public class B : A
{
public int z;
public B(int x, int y, int z) : base(x, y)
{
}
}
class Program
{
static void Main(string[] args)
{
var myA = new List<A>();
myA.Add(new A(1, 2));
myA.Add(new B(3, 4, 5));
Console.WriteLine(myA[1]);
Console.WriteLine("0.x = " + myA[0].x + "--0.y = " + myA[0].y);
Console.WriteLine("1.x = " + myA[1].x + "--1.y = " + myA[1].y + "--1.z = ");// I can't see myA.z
}
}
Это недопустимый синтаксис C#. Пожалуйста, предоставьте реальный код.
Не считая того факта, что ваш код не компилируется, все элементы в mylist
относятся к типу a
, что означает, что вы сможете получить только .x
. Для доступа к любым другим свойствам в производных классах вам нужно будет привести элемент списка к связанному объекту, например. as b
для доступа .y
и так далее. Более того, вам, вероятно, нужно сделать свойства класса public
, чтобы они были видны извне.
Я обновил свой код.
Я удалил свой прежний ответ, так как вы много обновили вопрос.
Причина, по которой вы не видите это свойство, заключается в том, что (как упоминалось в комментарии) список содержит только «контракт», содержащий экземпляры класса A
. Даже если он также содержит производные классы (например, класс B
), он все равно не может получить доступ к свойствам B
, потому что мы можем быть «уверены» только в том, что элементы внутри списка содержат, по крайней мере, все поведение и свойства класса. A
.
Это сделано для того, чтобы мы не могли случайно попытаться получить доступ к несуществующему свойству экземпляра A
во время выполнения.
Возможный дубликат C# — список различных типов объектов