【问题标题】:C# Generics: If T is a return type, can it also be void? How can I combine these interfaces together?C# 泛型:如果 T 是返回类型,它也可以是 void 吗?如何将这些接口组合在一起?
【发布时间】:2012-05-25 13:08:52
【问题描述】:

我有以下接口,它使用回调返回类型 T 的泛型参数...

public interface IDoWork<T>
{
    T DoWork();
}

但是我也有下面的接口,但是它不会调用回调,因为它返回 void。

public interface IDoWork
{
    void DoWork();
}

我可以结合这两个接口并使用运行时逻辑来确定差异吗?我该怎么做?

【问题讨论】:

  • 可惜你不在 Java 领域,因为你完全有能力做类似IDoWork&lt;Void&gt; ... 的事情。我有点惊讶 C# 没有提供这样的东西。
  • @ChrisCashwell,这是因为 .NET 泛型内置于 CLR 中,而在 Java 中它只是一个编译器技巧(JVM 在运行时对泛型一无所知)。虽然这通常是 .NET 泛型的一个优势,但这也意味着规则更加严格......
  • @ThomasLevesque 我在哪里可以详细了解 .NET 的方法与 Java 相比有何优势?
  • @makerofthings7,见this question
  • 谢谢@ThomasLevesque; TL;DR 版本:C# 泛型优于 Java 的好处是性能改进、深度类型安全验证和反射

标签: c# api generics api-design nul


【解决方案1】:

很遗憾,它们无法合并。

您可以在框架中看到这一点 - 这就是为什么有一个单独的 TaskTask&lt;T&gt; 类,例如。

话虽如此,您通常可以通过使用IDoWork&lt;object&gt; 并为值传递null 等来共享此类场景中的实现。

【讨论】:

  • 我想知道如果 T== object, and object == null 在实现中然后我可以跳过主机中的回调。这听起来合理吗?
  • @makerofthings7 你〜可以〜 - 但如果 null 是预期或有效值,则可能不合适..
  • 就个人而言,由于他们的行为不同,我想给他们稍微不同的名字来表达这种差异。
  • @ShaunWilde 我也会 - 在这种情况下我会有两个独立的界面,因为它们真的非常不同。
【解决方案2】:

返回类型是方法签名的一部分,所以 T DoWork() 和 void DoWork() 是不同的,void 不是类型也不是null。这表明从方法返回时评估堆栈中没有任何内容。

【讨论】:

猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 2017-04-06
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多