为什么我的通话无法ValueOrDefault
根据使用情况推断类型?
class Foo {
public string ValueA { get; set; }
public int ValueB { get; set; }
}
class Example {
// neither Func<T,bool> or Predicate<T> works
Func<Func<Foo,T>,T> ValueOrDefault<T>(Foo orig, Foo toReplace, Predicate<T> replaceIf) {
return getValue => {
var origValue = getValue(orig);
var replaceWith = getValue(toReplace);
return replaceIf(origValue) ? replaceWith : origValue;
};
}
public Response SaveSomeStuff(int clientId, Foo toSave) {
Foo fromDb = _dbService.GetFooByClientId(clientId);
var valueA = ValueOrDefault(toSave, fromDb, string.IsNullOrEmpty)(f => f.ValueA);
var valueB = ValueOrDefault(toSave, fromDb, i => i == 0)(f => f.ValueB);
var request = new Request {
ValueA = valueA,
ValueB = valueB,
};
return GetResponse(request);
}
}
不允许C#编译器使用方法的返回值来解析方法本身,包括任何类型推断。
方法组string.IsNullOrEmpty
和lambda都没有i => i == 0
提供足够的信息以T
在ValueOrDefault<T>
调用中派生。编译器不能使用您将f.ValueA
类型传递string
给第一个Func
,并将f.ValueB
类型int
传递给第二个的事实Func
,因为这些是ValueOrDefault<T>
方法的返回值。
如果您提供一种类型,例如,通过制作一个正确类型的单独变量,则可以编译代码:
Predicate<string> isNullEmpty = string.IsNullOrEmpty;
var valueA = ValueOrDefault(toSave, fromDb, isNullEmpty)(f => f.ValueA);
Predicate<int> isZero = i => i == 0;
var valueB = ValueOrDefault(toSave, fromDb, isZero)(f => f.ValueB);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句