为什么我的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);
}
}
答案 0 :(得分:2)
不允许C#编译器使用方法的返回值来解析方法本身,包括任何类型推断。
方法组string.IsNullOrEmpty
和lambda i => i == 0
都没有提供足够的信息来在T
调用中派生ValueOrDefault<T>
。编译器无法使用这样的事实:您将f.ValueA
类型string
传递给第一个Func
,将f.ValueB
类型int
传递给第二个{{1}因为这些是Func
方法的返回值。
如果你提供一个类型,例如,通过创建一个正确类型的单独变量,你就可以编译你的代码:
ValueOrDefault<T>