我真正想了解的是为什么将接口用作通用类的约束时,为什么我可以访问我在实现该接口的类中定义的“ Nume”属性。我的问题是:
没有接口,我无法从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);
}
}
我希望该代码在没有界面帮助的情况下也能正常工作,但是崩溃了。它在界面的帮助下起作用。
答案 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>
会造成混乱。如果我是编译器开发人员,则将其视为错误(至少是警告),并且我不会让这样的代码进行编译。