C# 泛型:如果 T 是返回类型,它也可以是 void 吗?如何将这些接口组合在一起?

Posted

技术标签:

【中文标题】C# 泛型:如果 T 是返回类型,它也可以是 void 吗?如何将这些接口组合在一起?【英文标题】:C# Generics: If T is a return type, can it also be void? How can I combine these interfaces together? 【发布时间】: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 的好处是性能改进、深度类型安全验证和反射 【参考方案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。这表明从方法返回时评估堆栈中没有任何内容。

【讨论】:

在c#中返回类型不是method signature的一部分

以上是关于C# 泛型:如果 T 是返回类型,它也可以是 void 吗?如何将这些接口组合在一起?的主要内容,如果未能解决你的问题,请参考以下文章

C#怎么定义泛型集合类型的函数,返回一个集合

C#如何将类型Type作为泛型T的参数T传递

C# 中var as is 泛型集合

详解C#泛型

C#实体类中如何定义泛型集合类型的属性

C#泛型列表<T>如何获取T的类型? [复制]