如果T在泛型中无效怎么办?如何省略尖括号

Nic*_*ick 7 c# generics void

我有一个这种类:

class A<TResult>
{
     public TResult foo();
}
Run Code Online (Sandbox Code Playgroud)

但有时我需要将此类用作非泛型类,即类型TResultvoid.
我无法通过以下方式实例化该类:

var a = new A<void>();
Run Code Online (Sandbox Code Playgroud)

另外,我宁愿不指定省略尖括号的类型:

var a = new A();
Run Code Online (Sandbox Code Playgroud)

我不想重写全班,因为它做同样的事情.

Che*_*hen 8

void不是在C#中一个真正的类型,即使有相应System.Void的FCL结构.我担心你需要这样的非通用版本:

class A
{
   //non generic implementation
}

class A<T> : A
{
   //generic implementation 
}
Run Code Online (Sandbox Code Playgroud)

你可以在FCL中看到System.Action/ System.Action<T>,而不是System.Action<void>,Task而不是Task<void>.

CLI规范编辑(ECMA-335):

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

Byref类型(例如,System.Generic.Collection.List`1 <string&>无效)

包含可指向CIL评估堆栈的字段的值类型(例如,List <System.RuntimeArgumentHandle>)

void(例如,List <System.Void>无效)