Skip to content

Instantly share code, notes, and snippets.

@Ivony
Last active August 29, 2015 13:58
Show Gist options
  • Save Ivony/9947267 to your computer and use it in GitHub Desktop.
Save Ivony/9947267 to your computer and use it in GitHub Desktop.
void support
//1、允许泛型参数类型为void,但其前提是该参数必须被标记为out
public Task<out T>
{
//...
}
Task<void> task;//合法
IEnumerable<void> data;//合法
IList<void> list;//不合法
Func<void> foo;//合法
Func<void, void> foo;//不合法
//2、在泛型类型参数定义中,void和Void等价,即以下两行等价:
Task<void>
Task<Void>
//3、在泛型委托里,返回值为void或者Void的泛型委托,可以与没有返回值的泛型委托互相隐式转换:
Func<void> foo = xxx;
Action action = foo;//合法
Action foo = xxx;
Func<void> func = foo;//合法
//4、Void类型的值,永远是nil == default(Void) == default(void) == null:
Task<void> task = xxx;
var result = task.Result;//result的值为nil;
result == null;//true
result == default(void);//true
//5、Void类型对object有隐式类型转换,转换结果为null:
object obj = default(void);
obj == null;//true
//6、调用Void类型实例任何方法都将抛出NullReferenceException,尽管这个实例存在:
(default(void)).ToString();//Exception
//特别的,连Equals方法和GetType方法也会抛出异常
(default(void)).Equals(default(void));//Exception
(default(void)).Equals(null);//Exception
(default(void)).GetType();//Exception
//7、对void的运算符操作与null保持一致:
string str = "hello" + default(void);//str值为"hello"
object obj = default(void) ?? "hello";//obj值为"hello"
//8、Void类型在不作为类型参数时,不能作为任何参数的类型,不能作为非out修饰的类型参数。但可以作为只读属性类型和变量类型:
void a = null;//合法
void a;//合法
public void P { get{ return default(void); } }//合法
public void P { get; private set; }//不合法
//9、特别的,当void表示一个类型或者类型参数时,Void和void是等价的,但当表示函数的返回值时,不等价
public void foo(){ ... }//合法,表示没有返回值
public Void foo(){ ... }//合法,表示返回值为void,必须以return default(void)结束
//10、在反射时,void foo()和Void foo()方法签名分别是void ()和Void (),所对应的委托类型也不相同。
//11、Void ()签名的方法和委托可以获取其返回值,返回值恒为nil,但void ()签名的委托和方法获取返回值时语法错误
public Void foo() { ... }
var result = foo();//合法,得到nil。
public void foo() { ... }
var result = foo();//不合法
public delegate Void D();
D d = xxx;
var result = d();//合法,得到nil
public delegate void D();
D d = xxx;
var result = d();//不合法
//12、Func<void>类型委托可以获取返回值,返回值为nil,Action类型委托不能获取返回值,会是语法错误:
Func<void> foo = xxx;
var result = foo();//合法
Action foo = xxx;
var result = foo();//不合法,不会自动类型转换。
Action foo = xxx;
var result = ((Func<void>) foo)();//合法,类型转换后可以获取返回值。
//13、如果类型参数T为void或Void,则将Void代入根据上述规则确定所有行为:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment