【发布时间】:2019-10-30 11:16:20
【问题描述】:
我真正想要了解的是,为什么当使用接口作为泛型类的约束时,我能够访问我在实现该接口的类中定义的“Nume”属性。我的问题是:
- 为什么我必须在泛型类中添加接口作为约束,而我已经在初始 Tr 类中实现了它?
- 为什么我不能直接从类中访问该属性,为什么我可以通过实现接口来访问它?
如果没有接口,我无法从 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