1

デリゲート Func <object, T> を共変的に使用しようとしていますが、成功しません。T はオブジェクトに変換可能ですが、 Func<object, string> (またはその他の具象型) は Func<object, object に変換できますが、 Func<object, T> は Func<object, object> に変換できないようです。 >予想通り。以下の問題を示すコードを参照してください。

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) 
    {   object o1;
        T o2 = default(T);
        o1 = o2; // works fine

        Func<object, object> f1 = o => o.GetType();
        Func<object, T> f2 = o => o as T;

        f1 = f2; //gives conversion error.
        f1 = f2 as Func<object, object>; // f2 as Func<object, object> is always null

        Func<object[], string> f1 = input => input.GetType().Name;
        Func<object[], object> f2 = input => new object();

        f2 = f1 // works fine

    }

msdnのドキュメントは、私が見たものから直接ジェネリック型パラメーターのケースに対処していません。ここで何が起こっているのか誰か説明できますか?

4

1 に答える 1

0

ジェネリック引数に型制約を適用する必要があります。

関数プロトタイプを次のように変更します。

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) where T : class

この行で:

Func<object[], object> f2 = input => new object();

...作成しているオブジェクトを T にキャストする必要もあります。

于 2012-07-19T05:15:27.003 に答える