C# 2.0 のコードに見えて,実は C# 3.0 以降でのみコンパイルできるコード
別に新しく入ったキーワード/構文のみが新機能ではない,ということで.
その1
using System; public delegate TResult Func<TResult>(); class Program { static Func<T> F<T>(Func<T> f) { return f; } static void Main(string[] args) { Func<int> f = F(delegate { return 1; }); Console.WriteLine(f()); } }
その2
using System; using System.Collections.Generic; using System.Text; class Program { static void Main(string[] args) { ItemList<TimeSpan> list = new ItemList<TimeSpan>(); // C# 2.0 ではコンパイルエラー // C# 3.0 ではコンパイルできる long totalTicks = list.Sum(delegate(TimeSpan span) { return span.Ticks; }); // C# 2.0 でもコンパイル可能 double totalDays = list.Sum(delegate(TimeSpan span) { return span.TotalDays; }); } } public delegate TResult Func<T, TResult>(T arg); class ItemList<T> : List<T> { public int Sum(Func<T, int> selector) { int sum = 0; foreach (T item in this) sum += selector(item); return sum; } public long Sum(Func<T, long> selector) { long sum = 0; foreach (T item in this) sum += selector(item); return sum; } public double Sum(Func<T, double> selector) { double sum = 0; foreach (T item in this) sum += selector(item); return sum; } }