【问题标题】:Property is accessible when using interface constraint in collections?在集合中使用接口约束时可以访问属性吗?
【发布时间】:2019-10-30 11:16:20
【问题描述】:

我真正想要了解的是,为什么当使用接口作为泛型类的约束时,我能够访问我在实现该接口的类中定义的“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);
    }        
}

我希望这段代码可以在没有界面帮助的情况下工作,但它崩溃了。它在界面的帮助下工作。

【问题讨论】:

  • “但它崩溃了”没有帮助,确切的错误是什么?在您的问题中包含该消息。您发布的代码运行没有错误,我们需要更多信息。
  • @Workout Channel,正如我从问题中得到的那样,没有where Tr : GET 约束的错误就在那里,你必须添加它来修复错误。对吗?
  • @Workout Channel,请参阅我的答案的更新。它给出了所有的解释。
  • 谢谢@Alex。所以,据我了解: 只是一个类型参数,它与实际的 Tr 类无关,它可以被任何东西替换。编译器知道的 Nume 属性,因为 类型参数实现了定义 Nume 属性的接口,所以编译器现在知道将替换 的对象必须包含 Nume 属性。如果我错了,请纠正我请。

标签: c# collections interface constraints


【解决方案1】:

class Program&lt;Tr&gt; 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}");
        }
    }
}

这就是原因

  • 您必须将接口作为约束添加到泛型类中
  • 您不能直接从类中访问该属性
  • 您可以通过实现接口来访问它

使用&lt;Tr&gt; 会造成混淆。如果我是编译器开发人员,我会将其视为错误(至少是警告),我不会让这样的代码编译。

这是&lt;Tr&gt;class Program&lt;Tr&gt; 不是Tr 类中的插图。

【讨论】:

  • 这个问题还没有完成,你怎么可能回答呢?发布的代码运行没有错误。
  • @DavidG,正如我从问题中得到的那样,没有where Tr : GET 约束的错误就在那里,OP 必须添加它来修复错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2013-06-22
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多