コンパイラがメソッドSetAll(PropertyInfo, int)
を期待しているので、次の呼び出しは失敗します。次の呼び出しがなぜあいまいですか?
var infos = GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
var setters = infos.Select(SetAll); // no overload matches delegate.
private Action SetAll(PropertyInfo info, object obj) =>() => info.SetValue(this, obj);
したがって、コンパイラはこのオーバーロードを使用できません。 int
をobject
にキャストできません。
これを念頭に置いて、なぜ次の呼び出しがあいまいですか?
var b = infos.Select(SetAll); // ambiguous between Select<PropertyInfo, int, Action>
// and Select<PropertyInfo, Action>
private Action SetAll(PropertyInfo info, object obj) =>() => info.SetValue(this, obj);
private Action SetAll(PropertyInfo info) =>() => info.SetValue(this, null);
コンパイラがオブジェクトに何らかの方法でオーバーロードを使用できない場合、なぜここで苦労しているのですか?
ここには実際のコードがあります。私はこの問題に簡単に対処することができますが、ちょうど骨董品です。
var infos = GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
if (useDefaultsOnReset)
{
var defaults = infos.Select(GetAll);
_resetters = infos.Zip(defaults, SetAll).ToArray();
}
else
{
_resetters = infos.Select(SetAll).ToArray(); // error
}
private object GetAll(PropertyInfo info) => info.GetValue(this);
private Action SetAll(PropertyInfo info, object obj) =>() => info.SetValue(this, obj);
private Action SetAll(PropertyInfo info) =>() => info.SetValue(this, null);
実際、[mcve]はここであなたを手伝ってくれます。 –
'(x、i)=> SetAll(x、i)'は動作します。それはそれに関連していますか? –
よくオブジェクトを使わずにオーバーロードを使いたいので、 '(x)=> SetAll(x)'になりますが、コンパイラはそれを理解できません。メソッドグループを使いたいのですが...:P @PatrickHofman –