在集合中使用接口约束时可以访问属性吗?

时间:2019-06-16 18:24:27

标签: c# collections interface constraints

我真正想了解的是为什么将接口用作通用类的约束时,为什么我可以访问我在实现该接口的类中定义的“ Nume”属性。我的问题是:

    1. 为什么在最初的Tr类中已经实现接口时,为什么必须在通用类中添加该接口作为约束?
    1. 为什么我不能直接从类中访问属性,为什么可以通过实现接口来访问它?

没有接口,我无法从Tr类访问属性,因此我实现了在this Stackoverflow问题上找到的解决方案,它似乎可以工作,但我不知道为什么。

我还查看了this 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 :(得分:0)

class Program<Tr> where Tr : GET Tr中,是 type参数,它只是名称,而没什么 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