C#无法从类转换到接口
我不熟悉使用接口,但在阅读了它之后,我认为接口的概念是,从接口派生的类可以在任何接受接口的地方被接受。这是我的密码:C#无法从类转换到接口,c#,visual-studio,interface,abstract-class,C#,Visual Studio,Interface,Abstract Class,我不熟悉使用接口,但在阅读了它之后,我认为接口的概念是,从接口派生的类可以在任何接受接口的地方被接受。这是我的密码: public interface IPersonOfInterest { //code requiring certain info to exist } public abstract class PersonOfInterest { public string[] GetBigPersonsInfo(List<IPersonOfInterest
public interface IPersonOfInterest
{
//code requiring certain info to exist
}
public abstract class PersonOfInterest
{
public string[] GetBigPersonsInfo(List<IPersonOfInterest> FromList)
{
//code to gather a list of info that is guaranteed to be in any IPersonOfInterest
return new string[] { };
}
}
public class BigDonors : PersonOfInterest, IPersonOfInterest
{
public List<BigDonors> SuchDonors = new List<BigDonors>();
public void GimmeDemInfos()
{
string[] GetInfo = GetBigPersonsInfo(SuchDonors); //<-- compiler error here
}
}
您已经正确地确定了接口的用途。您需要使用
列表
,因为这符合说明
总之
bigProvider
是继承的ipersonofindertest
,但List
不是从List
继承的。这意味着您将需要传递List
,但您将有机会向该列表中添加BigDonor
元素。将List
更改为List
@Hayden,那么任何试图调用类似于suchdonor[0]的东西的代码都会出错。GimmeDemInfos(),表示无法将BigProvider列表转换为IPERSONFINTERest列表?,因为它不能。你试着把草莓当作任何水果/蔬菜。这是有问题的——一个草莓小游戏只接受草莓。但是任何东西都可以用一个南瓜(显然不合适)。编译器正确地说“我不允许这样”。虽然可以将类强制转换为它的接口,但不能将类列表强制转换为它的接口列表。看这个问题我的问题很快被标记为已回答,但是,提供的答案只解释了问题,并没有给出真正的解决方案。
它给出了多个解决方案(IEnumerable
,例如,这大致相当于您使用IReadOnlyList
选择的方法)。此外,您的代码示例也无法编译。如果愿意,您还可以删除AsReadOnly
并且您可以在list@Ergis没错@LajosArpad(或Ergis)我认为这不是正确的解决方案。然后允许将其他类型添加到列表中,这显然不是OP想要的(给定属性和类的名称)。因此,剩下两个可能可行的解决方案(根据副本)。a) 调用该方法时创建一个新列表(即Cast.ToList()
)。b) 将方法签名从List
更改为IEnumerable
。b) 可能是OP需要的。
public interface IPersonOfInterest
{
//code requiring certain info to exist
}
public virtual class PersonOfInterest : IPersonOfInterest
{
//Changed to IReadOnlyList<IPersonOfInterest>, instead of List<IPersonOfInterest>:
public string[] GetBigPersonsInfo(IReadOnlyList<IPersonOfInterest> FromList)
{
return new string[] { };
}
}
public class BigDonors : PersonOfInterest
{
public List<BigDonor> SuchDonors = new List<BigDonor>();
public void GimmeDemInfos()
{
//Added .AsReadOnly(), and it now compiles:
string[] GetInfo = GetBigPersonsInfo(SuchDonors.AsReadOnly());
}
}