コンパイラは method を予期しているため、次の呼び出しは失敗し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);