In C# all delegate types are incompatible with one another, even if they have the same signature. What is the reasoning behind this behaviour and language design decision?
まず第一に、私はランタイムおよび言語設計者の多くは、この決定を後悔することを言って公正だと思います。デリゲートの構造型の入力、つまり署名による照合は頻繁に要求される機能であり、Func<int, bool>
とPredicate<int>
は互いに自由に割り当てることができないというのは奇妙なことです。
私が理解しているように、決定の裏にある理由は - そして、私がC#チームを始めてから約6年前にこの決定がなされたことを言い張ります - のデリゲートタイプセマンティクス。同じ引数が与えられたとき、「純粋な」関数が生成し、副作用を消費しない関数は、ある引数の外に何の情報を消費しない、と一貫性のある値を返します
AnyFunction<int, int> af = x=> { Console.WriteLine(x); return x + y; };
PureFunction<int, int> pf = af;
:あなたは、これは型エラーになりたいです。暗黙の変換としてpf
に割り当てられるべきではないことが明らかなので、少なくともaf
はそれらのうちの少なくとも2つに失敗します。
しかし、セマンティクスを積んだデリゲート型は決して起こらなかったので、現在は少し間違っています。
私はあなたに推論を与えることはできませんが、代議員は元の言語機能でした。それ以来、ラムダメソッド[Actions](http://msdn.microsoft.com/en-us/library/system.action.aspx)と[Funcs](http://msdn.microsoft.com/)が追加されています。 en-us/library/bb534960.aspx)には、同じ問題が発生しません。 – Brandon
@Brandon何ですか? Lambdaはデリゲート(または式ツリー)に変換され、 'Action'と' Func's *はデリゲート型だけなので、まったく同じルールに従います。 – svick
デリゲートの呼び出しは実行時にもチェックされます。これは重要な種類の最適化であり、厳密な型識別だけがサポートされています。それは速いです。 –