私はLINQに少し似たシステムを構築していて、それを実行する際に、ポリモーフィックコールバックハンドラーリストをサポートしようとしていますが、いくつかの種類の問題が発生しています。私の質問をする簡単な方法は、コードを表示することです。私の新しいシステムは「グループ」をサポートし、グループにはエントリポイントのベクトル(以下、UPDATEとCHECKPT)があり、ベクトルの各要素はデリゲートの多形リストであり、リフレクションを使用してコールバックします。
したがって、サンプルコード:
namespace ConsoleApplication1
{
internal delegate void GroupISDHandler(int i, string s, double d);
class Group
{
public class myHandlers {
internal List<Delegate> hList = new List<Delegate>();
public static myHandlers operator +(myHandlers a, Delegate b) {
a.hList.Add(b);
return a;
}
}
public class mimicVector {
public List<myHandlers> ListofhLists = new List<myHandlers>();
public myHandlers this[int i] { get { return ListofhLists[i]; } set { ListofhLists[i] = value; } }
}
public mimicVector handlers = new mimicVector();
public Group(string name) { ... }
}
class Program
{
internal const int UPDATE = 0;
internal const int CHECKPT = 1;
public static void Main()
{
Group g = new Group("group name");
g.handlers[UPDATE] += (GroupISDHandler)delegate(int x, string s, double d) {
Console.WriteLine("my int,string,double handler was called, with x = {0}, s = {1}, d = {2}",
x,s,d);
};
}
}
}
私の質問は登録ラインに集中しています。キャストと新しいデリゲートタイプを完全に省略できるように、C#でタイプを推測できないのはなぜですか?からだと思います
g.handlers[UPDATE] += delegate(int x, string s, double d) {
Console.WriteLine(....);
};
C#は、必要な型シグネチャを推測できます。デリゲート()は一種の匿名タイプであり、C#は次のようなものを生成します
private delegate void _atype1(int _a0, string _a1, double _a2)
(Delegate)(_atype1)
次に、行をコンパイルする前に挿入します。したがって、私のユーザーはデリゲート型を宣言する必要はありません(これにより、現在、引数リストを2回入力する必要があります)。
VS 2010を使用しているので、持っていますSystem.Linq
。したがって、LINQが必要なキャストを何らかの方法で推測できる場合は...