C# では、署名が同じであっても、すべてのデリゲート型は互いに互換性がありません。この動作と言語設計の決定の背後にある理由は何ですか?
まず、ランタイムと言語の設計者の多くがこの決定を後悔していると言っても過言ではないと思います。デリゲートの構造型付け (つまり、シグネチャによる照合) は、頻繁に要求される機能であり、 と を互いに自由に割り当てることができないのは奇妙に思えFunc<int, bool>
ますPredicate<int>
。
私が理解している決定の背後にある理由 (この決定は、私が C# チームに参加する約 6 年前に下されたことを急いで付け加えておきます) は、セマンティクスを持つデリゲート型が存在することを期待していたということです。これを型エラーにしたい:
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
「純粋な」関数とは、副作用を生成および消費せず、引数以外の情報を消費せず、同じ引数が与えられたときに一貫した値を返す関数です。af
それらのうちの少なくとも 2 つが明らかに失敗するためpf
、暗黙的な変換として に割り当てることはできません。
しかし、セマンティクスを多用したデリゲート型は決して発生しなかったため、現在は少し機能が間違っています。