我试图声明并使用这样的界面:
public interface IItem<T>
{
string Name { get; set; }
T Value { get; set; }
}
这一点正常,直到我尝试创建这些项目的列表。这无法编译:
public interface IThing
{
string Name { get; }
IList<IItem<T>> ThingItems { get; }
}
所以我不确定问题出在哪里。 items值直到运行时才定义,我需要有项目的集合。我认为这是一个相当标准的模式,但我无法看到我跌倒的地方。
答案 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)
两个问题:
interface
中声明字段。 (理由:一个字段被认为是一个实现细节,这是接口被设计为抽象的东西)答案 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; }
}