4.0中在聲明generic的Interface及Delegate時可以加in及out關鍵字,如:
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
public interface IEnumerator<out T> : IEnumerator
{
bool MoveNext();
T Current { get; }
}
public interface IComparer<in T>
{
public int Compare(T left, T right);
}
out關鍵字的意思是說IEnumerable<T>中T只會被用在輸出中,值不會被改變。這樣將 IEnumerable<string>轉為IEnumerable<object>類型就是安全的。
in的意思正好相反,是說IComparer<T>中的T只會被用在輸入中,這樣就可以將 IComparer<object>安全的轉為IComparer<string>類型。
前者被稱為Co-Variance, 後者就是Contra-Variance。
.Net4.0中使用out/in聲明的Interface:
System.Collections.Generic.IEnumerable<out T>
System.Collections.Generic.IEnumerator<out T>
System.Linq.IQueryable<out T>
System.Collections.Generic.IComparer<in T>
System.Collections.Generic.IEqualityComparer<in T>
System.IComparable<in T>
Delegate:
System.Func<in T, …, out R>
System.Action<in T, …>
System.Predicate<in T>
System.Comparison<in T>
System.EventHandler<in T>
Compiler as a Service
4.0中增加了與編譯器相關的API,這樣就可以將字符串作為代碼動態編譯執行,跟Javascript好像。
Video的最後,Anders做了一個很酷的demo,大概只用了二三十行代碼,就實現了在控制台中直接執行 C#語句,定義並調用函數,動態創建Windows form,添加button等功能,看起來完全不遜色於Python, Ruby之類語言的控制台。
沉寂了n年之後,CLR終於要出新版本了,這回Jeffrey Richter大俠沒有借口不出新版的CLR via C#了 吧:)
Reference:
視頻: http://channel9.msdn.com/pdc2008/TL16/
PPT:http://mschnlnine.vo.llnwd.Net/d1/pdc08/PPTX/TL16.PPTx
示例代碼及文檔(New features in C# 4.0):http://code.msdn.microsoft.com/csharpfuture