我看到以下代码行:
class Sample<T,U> where T:class where U: struct, T
在上面的情况中,参数U
是值类型,它派生自引用类型 T
。
这条线怎么合法?
此外,如果值类型继承自引用类型,则在哪里分配内存:堆或堆栈?
答案 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.ValueType
或System.Enum
(源自System.ValueType
)并且根据您是否选择而选择重新声明struct
或enum
。令人困惑的是,这两者本身就是参考类型......
答案 1 :(得分:2)
所有结构都隐式地从ValueType类型派生。您无法指定显式基本类型
请参阅codemelt
发布的this MSDN tutorial on structs。
答案 2 :(得分:1)
结构没有继承 有课程。结构不能 继承自另一个结构或类, 它不能成为一个阶级的基础。 然而,结构继承自 基类对象。结构可以 实现接口,它就是这样做的 正如班级一样。
答案 3 :(得分:1)
Sasha写道:
如果没有允许继承, 那么为什么以下是合法的:
class Samplewhere T:class where U:struct,T
在上面的例子中,参数U是 值类型,它源自T - 参考类型
虽然从通用合同的角度来看这是合法的,但是你永远不会得到任何使用该类进行编译的有用代码,因为你永远不会有一个满足U约束的T = System.Object以外的类型。您可能会认为在C#中实现泛型的一个非常小的错误。
答案 4 :(得分:0)
结构不能从System.ValueType或System.Enum以外的任何内容继承。结构无法从常规引用类型继承。所以不幸的是,这个问题无法回答。