C # No se puede convertir de clase a interfaz [duplicado]

Dec 14 2020

Soy nuevo en el uso de interfaces, pero después de leerlo, pensé que la idea de las interfaces era que una clase derivada de una interfaz sería aceptada en cualquier lugar donde se aceptara la interfaz. Aquí está mi 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 puede ver, BigDonorsse deriva de la IPersonOfInterestinterfaz. Entonces, ¿por qué da un error de compilador, diciendo que una lista de BigDonorno se puede convertir en una lista de IPersonOfInterest? Entiendo que no son lo mismo. Creo que sé lo que trato de hacer aquí, pero no me deja hacerlo.

EDITAR: Mi pregunta se marcó rápidamente como ya respondida, sin embargo, la respuesta proporcionada solo explica el problema, pero en realidad no da una solución. Entonces estoy editando esta pregunta con mi solución:

Para mi caso particular, no necesito poder agregar donantes a la lista, al menos no en el método abstracto. Entonces, el enlace de Andrew Shepherd reveló que el problema era que, aunque mi clase podía convertir a la interfaz, una lista no. Así que ahora paso una lista de solo lectura, que el compilador acepta:

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

Respuestas

LajosArpad Dec 14 2020 at 07:08

Ha identificado correctamente el propósito de las interfaces. Necesita usar List<IPersonOfInterest>, porque cumple con la descripción.

En breve

BigDonorse hereda IPersonOfInterest, pero List<BigDonor>NO se hereda List<IPersonOfInterest>. Esto significa que deberá List<IPersonOfInterest>aprobarlo, pero tendrá la oportunidad de agregar BigDonorelementos a esa Lista.