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;
    }
}