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>
{
}