Свойство доступно при использовании ограничения интерфейса в коллекциях? - PullRequest
1 голос
/ 16 июня 2019

Что я действительно хочу, так это понять, почему при использовании интерфейса в качестве ограничения универсального класса я могу получить доступ к свойству «Nume», которое я определил в классе, который реализует этот интерфейс. Мои вопросы:

    1. Почему я должен добавить интерфейс в качестве ограничения в общий класс, хотя я уже реализовал его в начальном классе Tr?
    1. Почему я не могу получить доступ к свойству напрямую из класса и почему я могу получить к нему доступ, реализовав интерфейс?

Без интерфейса я не могу получить доступ к свойству из класса Tr, поэтому я реализовал решение, найденное в этом вопросе Stackoverflow, похоже, он работает, но я не могу точно понять, почему.

Я также посмотрел эту документацию Microsoft.

interface GET
{
    int Nume { get; }
}

class Tr : GET 
{
    public int Nume { get; }

    public Tr() { }

    public Tr(int num)
    {
        this.Nume = num;
    }
}

class Program<Tr> where Tr : GET
{
   static List<Tr> lst = new List<Tr>();

    public void Test(Tr merge)
    {           
        lst.Add(merge);
        foreach (Tr cadt in lst)
        {
            Console.WriteLine($"Numarul este {cadt.Nume}");
        }
    }     
}

class MainC
{      
    static void Main(string[] args)
    {
        Tr cc = new Tr(2);

        Program<Tr> cls = new Program<Tr>();
        cls.Test(cc);
    }        
}

Я ожидал, что этот код будет работать без помощи интерфейса, но он завис. Работает с помощью интерфейса.

1 Ответ

0 голосов
/ 16 июня 2019

In class Program<Tr> where Tr : GET Tr - это параметр типа , это просто имя и оно не имеет ничего , связанного с Tr класс .Так что не не реализует GET, а не имеет для предоставления Nume свойства.Но если вы установите ограничение where Tr : GET, ситуация изменится.Теперь он реализует , реализует GET и имеет для предоставления Nume свойства.

Ваш класс эквивалентен:

class Program<T> where T : GET
{
    static List<T> lst = new List<T>();

    public void Test(T merge)
    {
        lst.Add(merge);
        foreach (T cadt in lst)
        {
            Console.WriteLine($"Numarul este {cadt.Nume}");
        }
    }
}

Это причина, по которой

  • необходимо добавить интерфейс в качестве ограничения в универсальный класс
  • . Вы не можете получить доступ к свойству напрямую из класса
  • .получить доступ к нему, реализовав интерфейс

Использование <Tr> создает путаницу.Если бы я был разработчиком компилятора, я бы отнесся к нему как к ошибке (по крайней мере, к предупреждению) и не позволил бы скомпилировать такой код.

Вот иллюстрация <Tr> в class Program<Tr>это не Tr класс.enter image description here

...