C# 如果T在泛型中是空的呢?如何省略尖括号

C# 如果T在泛型中是空的呢?如何省略尖括号,c#,generics,void,C#,Generics,Void,我有一个这样的类: class A<TResult> { public TResult foo(); } 另外,我不希望指定省略尖括号的类型: var a = new A(); 我不想重写整个类,因为它做同样的事情。C#中的void不是真正的类型,即使FCL中有相应的System.void结构。恐怕您需要这样一个非通用版本: class A { //non generic implementation } class A<T> : A { //

我有一个这样的类:

class A<TResult>
{
     public TResult foo();
}
另外,我不希望指定省略尖括号的类型:

var a = new A();

我不想重写整个类,因为它做同样的事情。

C#中的
void
不是真正的类型,即使FCL中有相应的
System.void
结构。恐怕您需要这样一个非通用版本:

class A
{
   //non generic implementation
}

class A<T> : A
{
   //generic implementation 
}
A类
{
//非通用实现
}
A类:A
{
//通用实现
}
您可以在FCL中看到有
系统.动作
/
系统.动作
,而不是
系统.动作
,以及
任务
而不是
任务

编辑来自:

下列类型不能用作中的参数 实例化(泛型类型或方法):

Byref类型(例如System.Generic.Collection.List`1是 (无效)

包含可指向CIL计算堆栈的字段的值类型(例如,列表)

无效(例如,列表无效)


正如我在评论中所发布的,通过继承泛型类,您可以使它看起来很好:

class A:A<object>
{
}
A类:A类
{
}

这显然隐藏了泛型参数,但请注意,根据我的经验,这是继承类的错误方式,每次这样做时,我都会后悔,因为我的类变得更复杂了。

void在C#中根本不是一个类型,所以不能将其作为类型参数。但尽管如此,有时你想要一种功能性,就好像它是一种功能性一样

在这种情况下,您可以使用一种简单的替换类型,很可能是一个非常小的sruct,例如用于反应式扩展。

另一种选择(这似乎是falanwe的目的)是使用NullObject设计模式。

@Davio是的,但这很可怕……在这种情况下,您必须创建一个没有约束的独立类
a
。但是,如果没有T,类实现是什么样子的呢?它有一个
tfoo()
方法。在void的情况下不应该是什么?如果你有需要,那么就创建一个非泛型的等价类。你可以通过
类a:a{}
来隐藏可怕之处,是的,它是有效的。我也在等待Rafal的答案,这样我就可以投票了。相反,我可以重用一个包含数百行代码的类,使用这个技巧+1只添加几十行代码
class A:A<object>
{
}