为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

查尔斯·兰伯特

为什么我的通话无法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);
  }
}
谢尔盖(Sergey Kalinichenko)

不允许C#编译器使用方法的返回值来解析方法本身,包括任何类型推断。

方法组string.IsNullOrEmpty和lambda没有i => i == 0提供足够的信息以TValueOrDefault<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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

来自分类Dev

在Julia中,宏可以访问其参数的推断类型吗?

来自分类Dev

类型推断失败:没有足够的信息来推断Kotlin的Paypal付款中的参数T

来自分类Dev

当在结构定义中明确指定类型时,无法推断类型参数T的类型

来自分类Dev

如果类型参数约束指定类型,为什么不能从用法推断类型参数?

来自分类Dev

为什么在通用函数类型参数推断中,Scala无法将Null类型识别为T的子类型?

来自分类Dev

为什么不能推断委托参数的类型?

来自分类Dev

为什么不能推断委托参数的类型?

来自分类Dev

C#通用方法,可以从表达式参数推断其类型参数

来自分类Dev

从参数动态推断通用方法的类型参数

来自分类Dev

无法从用法推断方法 JsonHelper.FromJson<T>(string) 的类型参数

来自分类Dev

类型参数不能从用法中推断出来

来自分类Dev

将类型的参数委托给方法的类型推断

来自分类Dev

为什么Typescript无法推断此函数的参数类型?

来自分类Dev

为什么TypeScript不能推断输入参数的类型

来自分类Dev

类型不能在通用类型或方法中用作类型参数“ T”-为什么?

来自分类Dev

在Scala中推断通用类型参数

来自分类Dev

推断功能链中的参数类型

来自分类Dev

模式匹配中的类型参数推断

来自分类Dev

为什么函数类型的参数不能接受其参数实现原始参数接口的参数?

来自分类Dev

为什么Scala不从泛型类型参数推断类型?

来自分类Dev

为什么Scala不从泛型类型参数推断类型?

来自分类Dev

推断通用类中的参数类型,这些参数类型是所提供参数的嵌套通用类型

来自分类Dev

为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

来自分类Dev

无法推断出通用参数T。工厂方法

来自分类Dev

重载方法时出现“无法推断通用参数'T'”错误

来自分类Dev

重载方法时出现“无法推断通用参数'T'”错误

来自分类Dev

无法推断通用参数T。工厂方法

来自分类Dev

无法从帮助程序类型的使用中推断方法的类型参数

Related 相关文章

  1. 1

    为什么此方法不能从签名中的Predicate <T>参数推断其参数类型?

  2. 2

    在Julia中,宏可以访问其参数的推断类型吗?

  3. 3

    类型推断失败:没有足够的信息来推断Kotlin的Paypal付款中的参数T

  4. 4

    当在结构定义中明确指定类型时,无法推断类型参数T的类型

  5. 5

    如果类型参数约束指定类型,为什么不能从用法推断类型参数?

  6. 6

    为什么在通用函数类型参数推断中,Scala无法将Null类型识别为T的子类型?

  7. 7

    为什么不能推断委托参数的类型?

  8. 8

    为什么不能推断委托参数的类型?

  9. 9

    C#通用方法,可以从表达式参数推断其类型参数

  10. 10

    从参数动态推断通用方法的类型参数

  11. 11

    无法从用法推断方法 JsonHelper.FromJson<T>(string) 的类型参数

  12. 12

    类型参数不能从用法中推断出来

  13. 13

    将类型的参数委托给方法的类型推断

  14. 14

    为什么Typescript无法推断此函数的参数类型?

  15. 15

    为什么TypeScript不能推断输入参数的类型

  16. 16

    类型不能在通用类型或方法中用作类型参数“ T”-为什么?

  17. 17

    在Scala中推断通用类型参数

  18. 18

    推断功能链中的参数类型

  19. 19

    模式匹配中的类型参数推断

  20. 20

    为什么函数类型的参数不能接受其参数实现原始参数接口的参数?

  21. 21

    为什么Scala不从泛型类型参数推断类型?

  22. 22

    为什么Scala不从泛型类型参数推断类型?

  23. 23

    推断通用类中的参数类型,这些参数类型是所提供参数的嵌套通用类型

  24. 24

    为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

  25. 25

    无法推断出通用参数T。工厂方法

  26. 26

    重载方法时出现“无法推断通用参数'T'”错误

  27. 27

    重载方法时出现“无法推断通用参数'T'”错误

  28. 28

    无法推断通用参数T。工厂方法

  29. 29

    无法从帮助程序类型的使用中推断方法的类型参数

热门标签

归档