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

#c# #derived-class

#c# #производный класс

Вопрос:

Я тестировал с некоторым кодом, и иногда я не могу получить доступ к методу, который находится в производном классе.Что я мог делать неправильно?

 namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            A[] test = new A[2];
            test[0] = new B();
            test[0].Example();
            test[0].Example1();
        }
        public class A
        {
            public void Example()
            {

            }
        }
        class B : A
        {
            public void Example1()
            {

            }
        }
    }
}
  

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

1. Статический тип массива — A[], а не B[]. Если вы не опустите каждый элемент, условно, вы не сможете получить доступ к Example1(). Это, или сделайте это виртуальным методом в A.

2. @TanveerBadar — Я думаю, что выражение «статический тип» вводит в заблуждение — вы должны просто сказать «тип».

3. Тип во время выполнения был бы B для этого элемента, однако тип во время компиляции — A. Это не вводит в заблуждение.

Ответ №1:

Вам нужно привести его к типу B следующим образом:

 namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            A[] test = new A[2];
            test[0] = new B();
            test[0].Example();
            (test[0] as B).Example1();
        }
        public class A
        {
            public void Example()
            {

            }
        }
        class B : A
        {
            public void Example1()
            {

            }
        }
    }
}
  

Если вы хотите узнать больше о приведении, ознакомьтесь с Документами.

Редактировать: Приведение работает в этом случае, потому что test[0] имеет тип B, если это было не так, выражение (test[0] как B) вернет null, что вызывает исключение NullReferenceException и означает, что test [0] не может быть приведено к типу B.

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

1. Вероятно, стоит упомянуть в вашем ответе, что if test[0] не является B , вы получите NullReferenceException (поскольку X as Y возвращает default(Y) — для ссылочных типов это означает, что null — if X не может быть приведен к Y )