C # Impossible de convertir de la classe en interface [dupliquer]

Dec 14 2020

Je suis nouveau dans l'utilisation des interfaces, mais après avoir lu dessus, j'ai pensé que l'idée des interfaces était qu'une classe dérivée d'une interface serait acceptée partout où l'interface était acceptée. Voici mon code:

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
    }
}

Comme vous pouvez le voir, BigDonorsest dérivé de l' IPersonOfInterestinterface. Alors pourquoi donne-t-il une erreur de compilation, disant qu'une liste de BigDonorne peut pas être convertie en liste de IPersonOfInterest? Je comprends que ce n'est pas la même chose. Je pense que je sais ce que j'essaye de faire ici, mais ça ne me laisse pas le faire.

EDIT: Ma question a été rapidement marquée comme déjà répondu, cependant, la réponse fournie n'explique que le problème mais ne donne pas vraiment de solution. J'édite donc cette question avec ma solution:

Pour mon cas particulier, je n'ai pas besoin de pouvoir ajouter des donateurs à la liste, du moins pas dans la méthode abstraite. Le lien d'Andrew Shepherd a donc révélé que le problème était que, bien que ma classe puisse se convertir à l'interface, une liste ne le pouvait pas. Alors maintenant, je passe une liste en lecture seule, que le compilateur accepte:

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

Réponses

LajosArpad Dec 14 2020 at 07:08

Vous avez correctement identifié le but des interfaces. Vous devez utiliser List<IPersonOfInterest>, car cela est conforme à la description.

En bref

BigDonorest hérité IPersonOfInterest, mais List<BigDonor>n'a PAS été hérité de List<IPersonOfInterest>. Cela signifie que vous devrez List<IPersonOfInterest>être passé, mais vous aurez la possibilité d'ajouter des BigDonoréléments à cette liste.