C # não é possível converter de classe para interface [duplicado]

Dec 14 2020

Eu sou novo no uso de interfaces, mas depois de ler sobre isso, pensei que a ideia de interfaces era que uma classe derivada de uma interface seria aceita em qualquer lugar em que a interface fosse aceita. Este é meu código:

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

Como você pode ver, BigDonorsé derivado da IPersonOfInterestinterface. Então, por que dá um erro do compilador, dizendo que uma lista de BigDonornão pode ser convertida em lista de IPersonOfInterest? Eu entendo que eles não são a mesma coisa. Acho que sei o que estou tentando fazer aqui, mas não estou me deixando fazer isso.

EDIT: Minha pergunta foi rapidamente marcada como já respondida, no entanto, a resposta fornecida apenas explica o problema, mas não dá realmente uma solução. Então, estou editando esta questão com minha solução:

Para meu caso específico, não preciso ser capaz de adicionar doadores à lista, pelo menos não no método abstrato. Portanto, o link de Andrew Shepherd revelou que o problema era que, embora minha classe pudesse ser convertida para a interface, uma lista não pode. Agora estou passando uma lista somente leitura, que o compilador aceita:

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

Respostas

LajosArpad Dec 14 2020 at 07:08

Você identificou a finalidade das interfaces corretamente. Você precisa usar List<IPersonOfInterest>, porque está de acordo com a descrição.

Em resumo

BigDonoré herdado IPersonOfInterest, mas List<BigDonor>NÃO foi herdado de List<IPersonOfInterest>. Isso significa que você precisará List<IPersonOfInterest>ser aprovado, mas terá a oportunidade de adicionar BigDonorelementos a essa Lista.