【问题标题】:Does C# generate concrete implementation for unused template parameters?C# 是否为未使用的模板参数生成具体实现?
【发布时间】:2012-10-22 13:31:44
【问题描述】:

如果我有

abstract class Base<TSub>
{
    protected static List<TSub> MyStaticList;
}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{

}

我得到两个独立的 MyStaticList 变量,每个基类一个。 相反,如果基地看起来像这样

class Base<TSub>
{
    protected static List<string> MyStaticList;
}

也就是说,没有使用模板参数,我能保证仍然得到两个独立的 MyStaticList 变量吗?

(对于自定义的类 Enum 类层次结构的 availableValues() 方法,我需要这个。)

【问题讨论】:

    标签: c# generics inheritance static


    【解决方案1】:

    具有不同类型参数的泛型类的两个实例化将产生两个独立的类,每个类都有自己的一组静态变量。所以答案是肯定的,静态变量Base&lt;ClassA&gt;.MyStaticListBase&lt;ClassB&gt;.MyStaticList 将是独立的。

    如果您想要相反的行为(即所有泛型类共享相同的静态变量),请将变量声明移动到非泛型类中,并使其成为泛型的基类,如下所示:

    public class BaseOfGeneric {
        protected static List<string> MyStaticList;
    }
    abstract class Base<TSub> : BaseOfGeneric 
    {
        ...
    }
    

    现在Base&lt;T&gt; 的所有实例都将共享相同的MyStaticList,无论它们的类型参数如何。

    【讨论】:

      【解决方案2】:

      http://blogs.msdn.com/b/gusperez/archive/2005/08/09/449363.aspx

      泛型类声明中的静态变量在所有人之间共享 相同封闭构造类型的实例(第 26.5.2 节),但不是 在不同封闭构造类型的实例之间共享。这些 无论静态变量的类型是否适用,规则都适用 是否涉及任何类型参数。

      编辑 Generic List and static variable behaviour in c#之前有人问过一个非常相似的问题

      您必须使用完全静态的构造才能在泛型类中使用。也许像......

      protected static List<TSub> MyStaticList = BaseUtil.MyStaticList
      

      【讨论】:

      • 即使根本没有使用类型参数?所以我可以使用“未使用”类型参数来强制创建一个单独的 MyStaticList 吗?
      • @B3ret 绝对可以。即使不使用该类型,您也会得到一个与使用不同类型参数集创建的类不兼容的不同类。
      猜你喜欢
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2021-04-13
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多