C # Kann nicht von Klasse zu Schnittstelle konvertieren [Duplikat]

Dec 14 2020

Ich bin neu in der Verwendung von Schnittstellen, aber nachdem ich sie gelesen hatte, dachte ich, dass die Idee von Schnittstellen darin besteht, dass eine von einer Schnittstelle abgeleitete Klasse überall dort akzeptiert wird, wo die Schnittstelle akzeptiert wird. Hier ist mein 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
    }
}

Wie Sie sehen können, BigDonorswird von der IPersonOfInterestSchnittstelle abgeleitet. Warum wird ein Compilerfehler ausgegeben, der besagt, dass eine Liste von BigDonornicht in eine Liste von konvertiert werden kann IPersonOfInterest? Ich verstehe, dass sie nicht dasselbe sind. Ich glaube, ich weiß, was ich hier versuche, aber ich darf es nicht tun.

BEARBEITEN: Meine Frage wurde schnell als bereits beantwortet markiert. Die Antwort erklärt jedoch nur das Problem, gibt aber keine wirkliche Lösung. Also bearbeite ich diese Frage mit meiner Lösung:

Für meinen speziellen Fall muss ich nicht in der Lage sein, Spender zur Liste hinzuzufügen, zumindest nicht in der abstrakten Methode. Der Link von Andrew Shepherd ergab also, dass das Problem darin bestand, dass meine Klasse zwar in die Benutzeroberfläche konvertieren konnte, eine Liste jedoch nicht. Jetzt übergebe ich eine schreibgeschützte Liste, die der Compiler akzeptiert:

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

Antworten

LajosArpad Dec 14 2020 at 07:08

Sie haben den Zweck von Schnittstellen korrekt identifiziert. Sie müssen verwenden List<IPersonOfInterest>, da dies mit der Beschreibung übereinstimmt.

Zusamenfassend

BigDonorwird geerbt IPersonOfInterest, wurde aber List<BigDonor>NICHT von geerbt List<IPersonOfInterest>. Dies bedeutet, dass Sie übergeben werden müssen List<IPersonOfInterest>, aber Sie haben die Möglichkeit BigDonor, dieser Liste Elemente hinzuzufügen .