Last active
August 29, 2015 13:58
-
-
Save Ivony/9947267 to your computer and use it in GitHub Desktop.
void support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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