Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#无法从类转换到接口_C#_Visual Studio_Interface_Abstract Class - Fatal编程技术网

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());
    }
}