// Supported by C# 3.0

public class C
{
	public delegate TR Func<TR, TA> (TA t);
	
	public static TR Test<TR, TA> (Func<TR, TA> f)
	{
		return default (TR);
	}
	
   	public static TR Test<TR, TA, TB> (Func<TR, TA> f, Func<TR, TB> f2)
	{
		return default (TR);
	}	
	
	public static void Test2<T> ()
	{
		T r = Test (delegate (T i) { return i; });
	}
	
	public static void Main()
	{
		int r = Test (delegate (int i) { return i < 1 ? 'a' : i; });
		string s = Test (delegate (int i) { return "a"; }, delegate (int i) { return "b"; });
	}
}