无法定义IList <t>,其中T是通用接口</t>

时间:2009-04-29 16:55:59

标签: c# generics

我试图声明并使用这样的界面:

public interface IItem<T>
{
  string Name { get; set; }
  T Value { get; set; }
}

这一点正常,直到我尝试创建这些项目的列表。这无法编译:

public interface IThing
{
    string Name { get; }
    IList<IItem<T>> ThingItems { get; }
}

所以我不确定问题出在哪里。 items值直到运行时才定义,我需要有项目的集合。我认为这是一个相当标准的模式,但我无法看到我跌倒的地方。

5 个答案:

答案 0 :(得分:6)

您的类也必须是通用的(Thing<T>),否则列表无法知道要使用的类型。

public interface Thing<T>
{
    string Name { get; }
    IList<IItem<T>> thingItems { get; }
}

修改 它现在编译。

修改 您似乎希望IItem<T>符合任何类型。这在C#中不起作用。你可以创建IList&gt;在这里,但这并不理想,因为当你想要把物品拿出来时,你会失去你的打字。

答案 1 :(得分:2)

  • 接口不能包含字段(数据成员)
  • 包含泛型类型的类型也是泛型类型

答案 2 :(得分:2)

两个问题:

  1. 您无法在interface中声明字段。 (理由:一个字段被认为是一个实现细节,这是接口被设计为抽象的东西)
  2. 如果没有指定类型参数,则不能有通用字段(除非您在声明类型上也有类型参数)。

答案 3 :(得分:2)

你倒下了,因为编译器想要知道列表中的项目类型。因此,如果您还不知道,只需创建一个非通用的基本接口,并派生一个更具体的通用接口:

也许这可以帮助你:

public interface IItem
{
  string Name { get; set; }
}

public interface IItem<T>: IItem
{
  T Value { get; set; }
}

public interface IThing
{
    string Name { get; }
    IList<IItem> Items { get; }
}

public interface IThing<T>: IThing
{
    string Name { get; }
    IList<IItem<T>> Items { get; }
}

答案 4 :(得分:0)

当您创建Thing的实例时,您必须知道Thing.thingItems的类型。所以以下是正确的方法。

public interface Thing<T>
{
    String Name { get; }
    IList<IItem<T>> thingItems { get; }
}

如果您在实现Thing时不知道concret类型,则只能使用公共基类或类型的公共接口。

public interface Thing<T>
{
    String Name { get; }
    IList<IItem<ThingParameterBase>> thingItems { get; }
}

或使用通用界面。

public interface Thing<T>
{
    String Name { get; }
    IList<IItem<IThingParameter>> thingItems { get; }
}