0

このエラーがあります:

タイプ 'System.Collections.Generic.List' を 'System.Collections.Generic.List' に暗黙的に変換することはできません

次のコードの場合:

リストに追加しようとすると:

if (information != null) // not empty
{
    foreach (CharacterInformation info in information)
    {
        chButtons.Add(new GuiSelectCharacterButton(
            selectGui,
            new Rectangle(100, 100, 450, 100)
        ));
        chButtons[chButtons.Count - 1].ImageTexture = GUISprites.Instance().GetTexture(UITexture.RainbowDash);
        chButtons[chButtons.Count - 1].Texture = GUISprites.Instance().GetTexture(UITexture.CommonButtonNotPressed);
        chButtons[chButtons.Count - 1].PressedTexture = GUISprites.Instance().GetTexture(UITexture.CommonButtonPressed);
        chButtons[chButtons.Count - 1].ImageTextureWidth = 90;
        chButtons[chButtons.Count - 1].ImageTextureHeight = 90;
        chButtons[chButtons.Count - 1].ButtonPressed += LoginCharacterHandler;
        chButtons[chButtons.Count - 1].Font = GameFonts.Instance().GetSpriteFont(FontType.UI);
        chButtons[chButtons.Count - 1].Information = information[chButtons.Count - 1];
    }
}
// error at this line
buttoncontainer.ButtonList = chButtons;

クラス宣言:

public class GuiSelectCharacterButton : GUIImageButton, IGameUserInterfaceImageButton
{
    public GuiSelectCharacterButton(GUI parent, Rectangle area)
        : base(parent, area)
    {

    }
}

インターフェース:

public interface IGameUserInterfaceImageButton : IGameUserInterfaceComponent
{
    bool InsideContainer { get; set; }
    Rectangle InsideContainerArea { get; set; }
}

IGameUserInterfaceImageButton のリスト:

private List<IGameUserInterfaceImageButton> buttonList;

public List<IGameUserInterfaceImageButton> ButtonList
{
    get
    {
        return buttonList;
    }
    set
    {
        buttonList = value;
        scrollbarThumbTotalHeight = marginButtons;
        scrollbarThumbY = 0;
        int yhelper = 0;
        foreach (IGameUserInterfaceImageButton button in buttonList)
        {
            yhelper += marginButtons;
            button.InsideContainer = true;
            button.InsideContainerArea = new Rectangle(
                marginXbutton,
                yhelper,
                button.Area.Width,
                button.Area.Height
            );
            yhelper += marginButtons + button.Area.Height;
            scrollbarThumbTotalHeight += button.Area.Height + marginButtons * 2;
        }
        scrollbarThumbDrawHeight = 0;
        if (scrollbarThumbTotalHeight > Area.Height)
        {
            scrollbarThumbDrawHeight = (int)Math.Pow(AreaScrollbar.Height, 2) / scrollbarThumbTotalHeight;
        }
    }
}

私のミスがどこにあるのかわからない。基本クラス (GUIImageButton) は、前述のインターフェースのすべてを実装します。プログラムの他の部分でこれを行いましたが、奇妙な理由でここでは機能しません。

4

2 に答える 2

1

短い答え:

インターフェイスとそれを実装するクラスがある場合:

public interface IFoo { }
public class Foo : IFoo { }

これは機能しません

var x = new List<Foo>();
x.Add(new Foo());
var y = new List<IFoo>();
y = x;

これ機能します:

var x = new List<IFoo>();
x.Add(new Foo());
var y = new List<IFoo>();
y = x;

説明

問題は、インスタンスをリストに追加しようとすることではありません。chButtons.Add()メソッドは正常に機能しています。

あなたの問題は、に割り当てようとするときchButtonsですbuttoncontainer.ButtonList。これらの2つの識別子は同じタイプではありません。あなたはタイプButtonListが何であるかを言いましたが、あなたは何であるかを言いませんでしたchButtons

私が思うに、chButtonsがである場合、List<GuiSelectCharacterButton>あなたがしていることはうまくいきません。;であっても、List<Foo>にを割り当てることはできません。これは「共分散」と呼ばれ、C#は具象クラスではサポートしていません。List<IFoo>Foo : IFoo

たとえば、chButtonsとまったく同じタイプを定義する場合、コードは正常に機能するはずです。ButtonListList<IGameUserInterfaceImageButton>

于 2012-09-06T23:25:02.147 に答える
1

から継承する場合List<A>List<IA>イベントから直接キャストすることはできません。 AIA

あなたができることはchButtons、タイプも作ることですIGameUserInterfaceImageButton。次に、アイテムを追加するときに、各アイテムをインターフェイスにキャストします。

var chButtons = new List<IGameUserInterfaceImageButton>();
chButtons.Add(
    (IGameUserInterfaceImageButton)new GuiSelectCharacterButton(
        // etc ...
    )
);
// this is now valid
buttoncontainer.ButtonList = chButtons
于 2012-09-06T23:25:33.240 に答える