1:object obj = GetObject();
2: obj.GetType().InvokeMember(“CallSomeFunc”, …., newobject[] { 1 });现在只需:
1: dynamic obj = GetObject();
2: obj.CallSomeFunc(1); // obj通过IDynamicObject接口,支持CallSomeFunc方法。这一切都是通过IDynamicObject接口实现的。只要对象支持IDynamicObject,那么任意对象都可以通过这种方式来直接调用,不管是COM,Python,JavaScript,等等。这个功能感觉基本上就是定义一个接口,然后编译器再把代码翻译一下就好了,关键还是各种对象的支持。 2. Optional Parameter / Named Parameters 以前C#特意不支持的可选参数终于现在可以支持了。命名参数也可以支持了,使用参数加冒号:
1: OpenTextFile(“foo.txt”, Encoding.UTF8, bufferSize:123)
3. Improved COM Interoperability 3.1 Automatic object –> dynamic mapping 原来返回object的地方,现在object可以自动被视为dynamic。因此,以前需要cast的地方现在可以省去cast了,反正dynamic对象可以通过IDynamicObject来间接调用IDispatch接口(我觉得应该还是通过MemberInfo.Invoke来间接调用IDispatch,但是暂时没有时间验证其实现方式)来自动调用对应的函数,而不需要cast到对应的interface再调用。原来是:(Range)excel.Cells[1, 1].Value = xxx; 现在可以写成:excel.Cells[1,1].Value = xxx; // call IDynamicObject.SetMember(“Value”, xxx); 3.2 Optional and named parameters 这个无需多说了吧。BTW,现在TlbImp的结果中(也就是Interop Assembly)已经在Metadata包含了缺省值,只是C#不用而已,现在C#可以直接使用了。 3.3 Indexed Property 这个Anders一句话带过,暂时不清楚具体是什么改进。 3.4 Optional ref modifier 在COM Interop时候可以不用写ref。具体的Anders也没有多谈。觉得应该是很小的改动。 3.5 Interop Type Embedding (NO PIA) 这个也就是之前我在前一篇提到的Type Equvalency。原来为了保证同一个COM接口具有相同的托管类型(因为对于同一个COM接口可以有多个对应的托管的接口),推荐使用PIA(Primary Interop Assembly)。但是,在使用PIA的过程中,发现PIA有不少问题,因此CLR Interop的某位牛人Architect想出了这个新Idea:不使用PIA,而是允许对应同一COM接口的不同托管接口之间可以互换使用,无需Cast,CLR内部将它们等价看待。这是一个比较大的改动,不管是对于编译器,还是CLR。更多的细节我会在以后的Blog中分若干次详细介绍。(Update:我的第一篇介绍这个新功能的文章:.NET 4.0: Type Equivalency (1) – Byebye,PIA) 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表明:
1:publicinterface IEnumerator<out T> // Co-Variant
2: {
3: T Current { get; }
4:bool Next();
5: }
6:
7: IEnumerator<string> strings = GetStrings();
8: IEnumerator<object> objects = strings; // 这个OK,反之报错
在上面的转换,意味着IEnumerator