'Classname <T>其中T:Classname <T>'是做什么的?

卢卡·富比尔(LucaFülbier)

我正在阅读有关原型模式的德语维基百科文章。示例部分包含使用以下内容的通用C#实现:

abstract class Prototype<T> where T : Prototype<T> { ... }
...
class ConcretePrototype : Prototype<ConcretePrototype> { ... }

这是如何运作的?如何将T限制为相同的泛型类?您如何使用类使用自身从通用类型派生?

我不是在编写C#,但是这似乎很有趣。

资料来源:原型模式

大卫·阿尔诺

ProtoType<T>有一个Clone方法,该方法以类型安全的方式返回具体的原型,因此T必须将其定义为类型参数。由于类型T只能是从派生的类Prototype,因此该行:

abstract class Prototype<T> where T : Prototype<T> { ... }

必须限制T为的子类Prototype由于Prototype是通用的,Prototype<T>必须在约束中指定。

从理论上讲,的声明ConcretePrototype应该只是:

class ConcretePrototype : Prototype<> { ... }

(或类似语法)。但是C#编译器不支持以这种方式推断类型参数。如果您输入以下内容:

class ConcretePrototype : Prototype<string> { ... }

Prototype<ConcretePrototype>由于方式Prototype的限制您将得到一个编译错误,因为它必须知道,这是必须的编译器需要对此进行显式声明,因此:

class ConcretePrototype : Prototype<ConcretePrototype> { ... }

我注意到Damien_The_Unbeliever击败了我以寻找参考,但是无论如何,我都会提到Eric Lippert在该主题上的出色文章绝对值得一读以帮助理解它,并理解为什么它会引起问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“回声!T”是做什么的?

来自分类Dev

`uniq -t`是做什么的?

来自分类Dev

这是什么意思: ClassName<T> where T : class

来自分类Dev

在mv命令中'-t'是做什么的?下面的例子

来自分类Dev

linux中的“ ls -t | head -n 1”是做什么的?

来自分类Dev

这是做什么的?printf'\ t%s \ n'“ $ @”

来自分类Dev

ClassName <T =“”>的含义和用法

来自分类Dev

`T {}`在Scala中做什么

来自分类Dev

什么是 ClassName.this?

来自分类Dev

interface <T>其中T:类

来自分类Dev

这段代码在做什么?(大小_t)-1

来自分类Dev

(std :: size_t)&((Structure *)0)-> last做什么?

来自分类Dev

“ new ClassName(this);”是什么?意思是?

来自分类Dev

为什么使用div.classname而不是.classname

来自分类Dev

ClassName obj =新的ClassName(this); 为什么要使用它?

来自分类Dev

ClassName method() => ClassName() 在 Dart 中是什么意思?

来自分类Dev

“ A类:B <C>”和“ A <T>:B <T>其中T:C”之间有什么区别?

来自分类Dev

“ A类:B <C>”和“ A <T>:B <T>其中T:C”之间有什么区别?

来自分类Dev

其中T:IEnumerable <T>方法约束

来自分类Dev

如何迭代List <T>,其中T:MyClass

来自分类Dev

声明List <IEntity <T >>,其中T:class

来自分类Dev

RestSharp ExecAsync <T>,其中T是嵌套对象

来自分类Dev

如何迭代List <T>,其中T:MyClass

来自分类Dev

声明List <IEntity <T >>,其中T:class

来自分类Dev

泛型约束的用途是什么?例如:其中T:IComparable

来自分类Dev

空的ClassName

来自分类Dev

为什么C#不能隐式转换Action <T>其中T:BaseType到Action <BaseType>

来自分类Dev

什么是C ++中的运算符T *(其中T是模板参数)?

来自分类Dev

为什么std :: get <T>其中T是调用constexpr函数的结果失败?

Related 相关文章

  1. 1

    “回声!T”是做什么的?

  2. 2

    `uniq -t`是做什么的?

  3. 3

    这是什么意思: ClassName<T> where T : class

  4. 4

    在mv命令中'-t'是做什么的?下面的例子

  5. 5

    linux中的“ ls -t | head -n 1”是做什么的?

  6. 6

    这是做什么的?printf'\ t%s \ n'“ $ @”

  7. 7

    ClassName <T =“”>的含义和用法

  8. 8

    `T {}`在Scala中做什么

  9. 9

    什么是 ClassName.this?

  10. 10

    interface <T>其中T:类

  11. 11

    这段代码在做什么?(大小_t)-1

  12. 12

    (std :: size_t)&((Structure *)0)-> last做什么?

  13. 13

    “ new ClassName(this);”是什么?意思是?

  14. 14

    为什么使用div.classname而不是.classname

  15. 15

    ClassName obj =新的ClassName(this); 为什么要使用它?

  16. 16

    ClassName method() => ClassName() 在 Dart 中是什么意思?

  17. 17

    “ A类:B <C>”和“ A <T>:B <T>其中T:C”之间有什么区别?

  18. 18

    “ A类:B <C>”和“ A <T>:B <T>其中T:C”之间有什么区别?

  19. 19

    其中T:IEnumerable <T>方法约束

  20. 20

    如何迭代List <T>,其中T:MyClass

  21. 21

    声明List <IEntity <T >>,其中T:class

  22. 22

    RestSharp ExecAsync <T>,其中T是嵌套对象

  23. 23

    如何迭代List <T>,其中T:MyClass

  24. 24

    声明List <IEntity <T >>,其中T:class

  25. 25

    泛型约束的用途是什么?例如:其中T:IComparable

  26. 26

    空的ClassName

  27. 27

    为什么C#不能隐式转换Action <T>其中T:BaseType到Action <BaseType>

  28. 28

    什么是C ++中的运算符T *(其中T是模板参数)?

  29. 29

    为什么std :: get <T>其中T是调用constexpr函数的结果失败?

热门标签

归档