结构如何从类型参数约束中的类继承?

时间:2009-02-24 02:41:09

标签: c# .net memory-management type-parameter

我看到以下代码行:

class Sample<T,U> where T:class where U: struct, T

在上面的情况中,参数U值类型,它派生自引用类型 T

这条线怎么合法?
此外,如果值类型继承自引用类型,则在哪里分配内存:堆或堆栈?

5 个答案:

答案 0 :(得分:6)

与另一个答案相反,除了T = System.Object之外还有其他类型的编译:

class Samplewhere T:class where U:struct, T

“T:class”约束实际上并不意味着T必须是一个类。这意味着T必须是参考类型。这包括接口,结构可以实现接口。因此,例如,T = IConvertible,U = System.Int32非常适用。

我无法想象这是一个特别常见或有用的约束,但它并非完全与乍一看似违反直觉。

至于更一般的观点:正如Obiwan Kenobi所说,这一切都取决于你的观点。 CLI规范对此有一个非常复杂的解释,其中“派生自”和“继承自”并不意味着完全相同的事情,IIRC。但不,您不能指定值类型的基本类型 - 它始终是System.ValueTypeSystem.Enum(源自System.ValueType)并且根据您是否选择而选择重新声明structenum。令人困惑的是,这两者本身就是参考类型......

答案 1 :(得分:2)

所有结构都隐式地从ValueType类型派生。您无法指定显式基本类型 请参阅codemelt发布的this MSDN tutorial on structs

  • 实例化结构时,例如作为局部变量,它们被分配在堆栈上(更好的性能)
  • 类可以包含结构作为成员 - 在这种情况下,它们在堆上分配。

答案 2 :(得分:1)

MSDN说,

  

结构没有继承   有课程。结构不能   继承自另一个结构或类,   它不能成为一个阶级的基础。   然而,结构继承自   基类对象。结构可以   实现接口,它就是这样做的   正如班级一样。

答案 3 :(得分:1)

  

Sasha写道:

     

如果没有允许继承,   那么为什么以下是合法的:

     

class Samplewhere T:class where   U:struct,T

     

在上面的例子中,参数U是   值类型,它源自T -   参考类型

虽然从通用合同的角度来看这是合法的,但是你永远不会得到任何使用该类进行编译的有用代码,因为你永远不会有一个满足U约束的T = System.Object以外的类型。您可能会认为在C#中实现泛型的一个非常小的错误。

答案 4 :(得分:0)

结构不能从System.ValueType或System.Enum以外的任何内容继承。结构无法从常规引用类型继承。所以不幸的是,这个问题无法回答。