4. Co-Variance & Contra-Variance
这个相对难以理解一些。Co-Variance和Contra-Variance在这系列文章中有讲述:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx,此人是C#编译器的Dev,自然有比较权威的解释,而且这个系列有N篇文章,讲的比较复杂。有空我会把这块内容详细在Blog中解释一下。
简单来讲,Co-Variant表示某模板参数用作传出,也即是函数的返回值或者out参数,等等,用关键字out表明:
public interface IEnumerator<out T> // Co-Variant { T Current { get; } bool Next(); } IEnumerator<string> strings = GetStrings(); IEnumerator<object> objects = strings; // 这个OK,反之报错 |
在上面的转换,意味着IEnumerator可以被视作IEnumerator
反之,Contra-Variant表示模板参数T只能被用在函数入参或者属性的入参,用in表示:
public interface IComparer<in T> // Contra-Variant { int Compare(T x, T y); } IComparer<object> objComp = GetComparer(); IComparer<string> strComp = objComp; // 这个OK,反之报错 |
类似的,任何使用IComparer.Compare(string x, string y)的地方都会传入string,自然会被IComparer
5. C# 5.0
5.1 Meta-Programming Capabilities
学习Ruby On Rails,引入强大的Meta-Programming能力。
5.2 Compiler As Service
用托管代码重写编译器(原来是用C++编写的,使用IMetaDataEmit接口输出PE文件),支持其他人编写代码参与整个编译过程(估计类似Plugin)或者调用编译过程(类似已有的动态语言的eval功能)。
Anders演示了通过CSharpEvaluator直接编译用string表示的C#代码然后直接执行:
CSharpEvaluator ev = new CSharpEvaluator(); ev.Eval(“for (int i = 0; i < 10; i++) { … }"); |
通过这个就可以很容易写一个C#的Shell了:
C#> int Add(int a, int b) { return a+b; }
C#> Add(1, 2)
3
C#> Form = new Form() { Text = “Hello World” };
这个基本上是原来的动态语言的强项,现在C#也可以做了!
【编辑推荐】
| 第 1 页:dynamic/IDynamicObject | 第 2 页:Co-Variance & Contra-Variance |






















