gpt4 book ai didi

c# - 结果是类型的交集?

转载 作者:行者123 更新时间:2023-12-02 03:56:43 26 4
gpt4 key购买 nike

有关记录:类型的并集与交集,请参阅:Advanced Types in TypeScript

假设我有接口(interface) IAIB。创建这些参数的交集作为参数非常容易,而无需创建额外的接口(interface)。

void Foo<T>(T t) where T : IA, IB

但是,当结果应该是类型的交集时,我看不到执行相同操作的明确方法。考虑提供商/工厂场景:

interface IProvider
{
T Provide();
}

稍后消费者将获得此提供者:

void Consume(IProvider provider)

问题是如何定义T。如果我定义它使 Provide 方法通用:

T Provide<T>() where ...

这没有意义,因为这意味着消费者能够以某种方式告诉现有的提供者它提供什么类型。

如果我将整个提供程序定义为泛型类型:

interface IProvider<T> where ...
{
T Provide();
}

这更有意义,但现在方法 Consume 也必须是通用的,并且需要定义联合开始的通用约束“泄漏”很快使代码变得丑陋。

那么有没有一种方法可以干净、正确地表达它呢?与输入交集时一模一样——简短、干净且正确。

更新:作为解决方法,我现在使用类型 Intersection 提供类型检查,但代价是额外的内存消耗。

最佳答案

TL;DR: 我很遗憾地告诉您,您所要求的 — 使用方法返回类型的交集类型 — 在 C# 中根本不可能实现。类型系统不够复杂。

您可能会找到我的软件工程 SE 问题 "Which statically typed languages support intersection types for function return values?"出于兴趣。我很惊讶地发现 Java 在这方面优于 C#。

C# 中的交集类型(“AB”):

  • 可以使用泛型的方法参数:

    void Method<T>(T parameter) where T : A, B
  • 对于方法返回类型不可能。 (当然,您可以诉诸后期绑定(bind)技巧,例如 dynamic 或使用 System.Reflection.Emit/Castle DynamicProxy 动态创建匹配的交集类型(这通常用于模拟框架,例如 Moq 来即时生成类型) -fly);我只是在这个答案中考虑静态类型/类型系统的可能性。)

C# 中的联合类型(“AB”):

  • 可以使用多种语言机制的方法参数:

    • 方法重载:

      void Method(A parameter);
      void Method(B parameter);
    • 使用隐式类型转换:

      struct AorB
      {
      public static implicit operator AorB(A a) { ... }
      public static implicit operator AorB(B b) { ... }
      }

      void Method(AorB parameter);
  • 可以使用某种通用的、可区分的类似联合类型 Either<A, B> 来伪造返回值.

关于c# - 结果是类型的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com