【问题标题】:Mnemonic for C# generic typesC# 泛型类型的助记符
【发布时间】:2010-08-27 16:15:08
【问题描述】:

我经常忘记在定义协变和逆变泛型类型时是否必须使用inout。在java中,我有助记符PECS(生产者扩展消费者超级)来帮助我。你知道类似的 c# 助记词吗?

【问题讨论】:

  • RELB - 阅读 Eric Lippert 的博客blogs.msdn.com/b/ericlippert/archive/tags/…
  • 我很少定义遗传学,除非尝试创造 12 英尺的蜥蜴人,每个人都喜欢蜥蜴人。
  • @Jimmy Hoffa - 是的,但是任何超过 10 英尺的东西都只是矫枉过正。
  • @Joel Etherton:他们是蜥蜴人,过度杀伤才是重点
  • 知道何时使用它们不是很容易吗,因为in 表示接口正在接收某些内容,out 表示它正在输出某些内容?我永远不记得哪个是协方差和逆变方差,但inout 的使用从来都不是问题。

标签: c# generics covariance contravariance mnemonics


【解决方案1】:

当他们称它们为“输入”和“输出”而不是协变和逆变时,他们不是为我们这样做了吗?试想一下:我是在推动价值观“进来”,还是让他们“出去”?如果不确定,请尝试“out”——它更常见(也更容易理解)。

【讨论】:

  • 虽然这是真的,但不是很吸引人。
【解决方案2】:

in 类型被传递给函数 inout 类型从函数返回 out

【讨论】:

  • 这不是 mR_fr0g 所要求的。当用作泛型类变体类型修饰符(这是 C# 4.0 的新功能)时,他想要一个 in 和 out 的助记符,而不是方法参数的常见旧用法。
  • rsenna:这正是 rsenna 所要求的。创建泛型接口时,只传入函数的类型可以获得in标签,只从函数返回的类型可以获得out标签。传入和返回的类型(或用作refout 参数)是不变的,无法获取任何一个标签。
【解决方案3】:

当我不记得时,我总是参考IEnumerable<out T>(这意味着我当然必须记住那个接口的签名......)。您只能从IEnumerable<out T> 中获取 T “out”的实例,因此它是协变的。如果您只能将 T "in" 的实例传递给接口(或委托,这更常见),那么它是逆变的。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多