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

25

我有一个接口,使用回调函数返回T类型的泛型参数...

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

然而,我还有以下界面,但它不会调用回调函数,因为它返回void。
public interface IDoWork
{
    void DoWork();
}

我能否将这两个接口合并,并使用运行时逻辑来确定它们之间的区别?我该如何做到这一点?


1
真遗憾你不在Java领域,因为你完全有能力做出像 IDoWork<Void> ... 这样的东西。我有点惊讶C#没有提供这样的功能。 - Chris Cashwell
1
@ChrisCashwell,这是因为.NET通用类型是内置于CLR中的,而在Java中它只是编译器的技巧(JVM在运行时并不知道任何关于泛型的信息)。虽然这通常是.NET通用类型的优势,但也意味着规则更加严格... - Thomas Levesque
@ThomasLevesque 我在哪里可以了解更多关于.NET的方法如何优于Java的优势? - makerofthings7
@makerofthings7,请查看这个问题 - Thomas Levesque
感谢@ThomasLevesque;简短版本:C#泛型相比Java的优点是性能提升、深度类型安全验证和反射。 - makerofthings7
2个回答

21

很不幸,它们无法合并。

你可以在框架中看到这一点 - 这就是为什么有单独的TaskTask<T> 类。

话虽如此,在这种情况下,您通常可以通过使用IDoWork<object>并传递null值等来共享实现。


我在想如果 T== object,且 object == null 在实现中,那么我是否可以跳过主机中的回调函数。这听起来合理吗? - makerofthings7
@makerofthings7 你可以这样做,但如果null是一个预期或有效的值,那么这可能是不合适的。 - Reed Copsey
1
个人而言,由于它们的行为不同,我想给它们略微不同的名称来表达这种差异。 - Shaun Wilde
1
@ShaunWilde 我也会这样做 - 在这种情况下,我会有两个不同的接口,因为它们实际上非常不同。 - Reed Copsey

2

返回类型是方法签名的一部分,因此T DoWork()和void DoWork()是不同的,而void不是一种类型,也不是null。它表示在从方法返回时评估堆栈中没有任何内容。


在C#中,返回类型不是方法签名的一部分。 - suhair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接