Следующий вызов завершится неудачно, потому что компилятор ожидает метод 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 –