Scala すごい。C# は残念。

今日会社で、

using System;
class Foo {}
class Bar {}
class Hoge
{
    internal static Foo M(Func<int, int> f) { return null; }
    internal static Bar M(Func<string, string> f) { return null; }
}
class Piyo
{
    internal static void A(Foo f) { Console.WriteLine("Foo"); }
    internal static void B(Bar b) { Console.WriteLine("Bar"); }
}
public class Program
{
    public static void Main()
    {
        Piyo.A(Hoge.M(i => i));
        Piyo.B(Hoge.M(s => s));
    }
}

みたいなコードを書いたんですが、コンパイルエラーになってしまいました。
帰ってきてから Scala で同じようなコード、

class Foo
class Bar
 
object Hoge {
  def hoge(f: Int => Int): Foo = null
  def hoge(f: String => String): Bar = null
}
 
object Piyo {
  def a(f: Foo) = println("Foo")
  def b(b: Bar) = println("Bar")
}
 
object Main {
  def main(args: Array[String]) {
    Piyo.a(Hoge.hoge(i => i))
    Piyo.b(Hoge.hoge(s => s))
  }
}

を試してみたら、普通に動きました。Scala すごい。
まぁ、C# でも型を明示すれば動くんですが・・・

public class Program
{
    public static void Main()
    {
        Piyo.A(Hoge.M((int i) => i));
        Piyo.B(Hoge.M((string s) => s));
    }
}

なんだかとても残念。