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()方法工作正常。

您的问题是尝试分配chButtonsbuttoncontainer.ButtonList. 这两个标识符的类型不同。你已经说过什么是类型ButtonList,但你还没有说什么chButtons是。

如果,正如我所怀疑的那样,chButtons是 a List<GuiSelectCharacterButton>,那么你正在做的事情是行不通的。您不能将 a 分配List<Foo>给 aList<IFoo>即使Foo : IFoo; 这称为“协方差”,C# 在具体类上不支持它。

如果您定义chButtons与 具有完全相同的类型ButtonList,例如 a List<IGameUserInterfaceImageButton>,那么您的代码应该可以正常工作。

于 2012-09-06T23:25:02.147 回答
1

当从 继承时,您不能直接将 fromList<A>转换为List<IA>事件。 AIA

你能做的也是使chButtonstype 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 回答