【问题标题】:Multiple Struct Types in One List一个列表中的多个结构类型
【发布时间】:2015-05-17 05:15:06
【问题描述】:

有没有办法使用类here 描述的方法在一个列表中拥有多个结构类型?

参考一个告诉我从抽象类(结构不可能)或接口继承的答案,我想出了这个:

public interface IMemorable {}

public struct Memorable<type> : IMemorable where type : struct 
{
    private type Data;

    public Memorable<type> (type data) 
    {
        Data = data;
    }
}

并以这种方式实现列表:

List<Memorable> memorables;
memorables.Add (new Memorable<someStruct> ());
memorables.Add (new Memorable<otherStruct> (new otherStruct (6, "Six")));

哪个应该起作用,因为它与类一起使用,并且我认为结构确实支持接口的继承?

我得到了这个错误:

Assets/Test.cs(51,22): error CS0305: Using the generic type `Memorable<T>' requires `1' type argument(s)

在列表声明行中

或者你能引导我找到更好的解决方案吗?关于性能,我可能需要存储数千个这样的结构。我不确定在这种方法是否可行的情况下,从抽象类继承的类是否更合适......

你能给我建议吗?

【问题讨论】:

  • 为什么你想这样做?我相信还有其他方法可以解决您的性能问题
  • 请注意,将结构存储为接口会完全破坏您可能追求的任何性能优势,因为只会存储对装箱实例的引用
  • 那么您认为使用具有抽象类作为基础的类会更好吗? :|我现在正在进行运行时测试:)

标签: c# list inheritance struct types


【解决方案1】:

是的(有一些小的更正),但它没有用:

public interface IMemorable {}

public struct Memorable<T> : IMemorable where T : struct 
{
    private T Data;

    public Memorable(T data) 
    {
        Data = data;
    }
}

List<IMemorable> memorables = new List<IMemorable>();
memorables.Add(new Memorable<someStruct>(new someStruct()));
memorables.Add(new Memorable<otherStruct>(new otherStruct(6, "Six")));

(请注意,泛型类型通常称为TSomethingTS 大写))

因为那时你只有一个IMemorable,你不能用它来访问T Data

我要补充一点,一般来说,struct(以及所有值类型)和接口不能很好地混合,因为将struct 转换为接口会导致其装箱(因此创建结构),有一个例外(这里不相关)

【讨论】:

  • 很好的答案,但为什么他不能访问 T Data?他不应该可以((Memorable&lt;SomeStruct&gt;)memorables[1]).Data吗?
  • @Seneral 您的错误可能会出现,因为您缺少public Memorable (T data) : this()
  • @Seneral List&lt;Memorable&gt; memorables; 必须是 List&lt;IMemorable&gt; memorables... 你必须有一个接口列表
  • 更新了错误码;它与列表声明有关,其中 Memorable 需要方括号中的类型,我打算避免使用 IMemorable 接口...
  • @bokibeg 是的,他可以访问数据,但是很难......他没有使用多态,他必须检查每个元素的类型,将其转换为这种类型,然后访问它,所以他必须复制代码 n 次,每个结构一个他将用作通用参数。
【解决方案2】:

错误消息告诉您在将类Memorable&lt;T&gt; 的类型参数T 用作List&lt;&gt; 声明的类型参数时定义它。

通常不可能声明包含多个不同结构类型的列表,除非您将列表声明为包含这些结构的任何常见父类型。那将是objectSystem.ValueType(所有结构的直接父类)或任何公共声明的接口。

仅在类型参数上不同的两个泛型类型不会自动具有比具有相同父类的任何其他两个类型更具体的公共类型。换句话说,具有不同T 的各种Memorable&lt;T&gt; 结构类型没有比任何其他两个结构类型更多的派生公共父级。任何可以同时包含它们的列表也至少可以包含任何其他结构类型,并且只能以盒装形式,即作为引用,而不是值。 (哪种方式违背了将它们声明为结构的想法,除非您还有其他原因。)

【讨论】:

  • 谢谢你清理了很多:) 我想我在查找或相等比较器时是否需要为每个列表元素转换类型;如果我这样做了,我肯定需要一个不同的解决方案......
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
相关资源
最近更新 更多