C#クラスからインターフェイスに変換できません[重複]

Dec 14 2020

私はインターフェイスを使うのは初めてですが、それを読んだ後、インターフェイスのアイデアは、インターフェイスから派生したクラスが、インターフェイスが受け入れられる場所ならどこでも受け入れられるということだと思いました。これが私のコードです:

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

ご覧のとおり、BigDonorsIPersonOfInterestインターフェースから派生しています。では、なぜリストBigDonorをリストに変換できないというコンパイラエラーが発生するのIPersonOfInterestでしょうか。私はそれらが同じものではないことを理解しています。私はここで何をしようとしているのか知っていると思いますが、それは私にそれをさせてくれません。

編集:私の質問はすぐにすでに回答済みとしてマークされましたが、提供された回答は問題を説明するだけで、実際には解決策を提供していません。だから私は私の解決策でこの質問を編集しています:

私の特定のケースでは、少なくとも抽象メソッドでは、ドナーをリストに追加できる必要はありません。したがって、Andrew Shepherdのリンクは、問題は、私のクラスはインターフェースに変換できても、リストは変換できないことであると明らかにしました。だから今、私はコンパイラが受け入れる読み取り専用リストを渡します:

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

回答

LajosArpad Dec 14 2020 at 07:08

インターフェイスの目的を正しく特定しました。List<IPersonOfInterest>説明に準拠しているため、を使用する必要があります。

要するに

BigDonor継承されているIPersonOfInterest、しかしList<BigDonor>から継承されませんでしたList<IPersonOfInterest>。これは、List<IPersonOfInterest>合格する必要があることを意味しますがBigDonor、そのリストに要素を追加する機会があります。