Func和Cannot隐式转换类型

本文关键字:转换 类型 Cannot Func | 更新日期: 2023-09-27 17:57:29

所以我有一个简单的代码示例,但我不知道如何重写它。代码:

 class Program
  {
    static void Main(string[] args)
    {
      var cat = new Cat();
      cat
        .ToFeed(arg => LikeMilk(1), c => c.Inc())
        .ToFeed(arg => LikeMilk(2), c => c.Inc());
    }
    private static bool LikeMilk(int liters)
    {
      return liters <1;
    }
  }
  public class Cat
  {
    private int Weith { get; set; }
    public void Inc()
    {
      Weith++;
    }
    public Cat ToFeed(Func<int, bool> predicate, Action<Cat> action)
    {
      if (predicate)  // Error: Cannot implicitly convert type 'System.Func<int,bool>' to 'bool' 
        action(this);
      return this;
    }
  }
}

当然,我可以将签名ToFeed更改为ToFeed(bool predicate, Action<Cat> action),,但我不想这样做。我知道我必须在谓词的调用中添加int参数,但我已经在Main() 中添加了它

我该如何解决这个问题?

感谢

Func和Cannot隐式转换类型

我认为您的方法应该是这样的:

public Cat ToFeed(Func<int, bool> predicate, Action<Cat> action)
{
  if (predicate(Weith)) // By the way, it is properly the word Weight you're looking for :)
    action(this);
  return this;
}

CCD_ 4执行具有属性CCD_ 6的值的函数CCD_。Func<int, bool>本身不是bool(true/false-这是if语句所期望的。)然而,它是你可以用int作为参数来执行以获得bool的东西,因此你需要(arguments)

更新:

我不完全确定你想要什么。但你可以按照你自己说的做,用bool代替Func<*>。如果你想推迟对LikeMailk的评估,你可以这样说:

public Cat ToFeed(Func<bool> predicate, Action<Cat> action)
{
  if (predicate())
     action(this);
  return this;
}

var cat = new Cat().ToFeed(() => LikeMilk(1), c => c.Inc())
                   .ToFeed(() => LikeMilk(2), c => c.Inc());

但这没有多大意义,因为您的方法LikeMilk将返回相同的延迟执行或不执行。

您将函数值传递给'ToFeed',而不是布尔值

if (predicate(this.liters))   //Check whether cat still wants milk. Yum!
    action(this);

编辑:现在我仔细看一下你的代码,我发现你在主函数中对升的数量进行了硬编码,因此lambda参数arg是无用的。

您应该将主方法中的代码更改为:

var cat = new Cat();
      cat
        .ToFeed(arg => LikeMilk(arg), c => c.Inc())
        .ToFeed(arg => LikeMilk(arg), c => c.Inc());

现在lambda实际上使用了传递的参数。然后,您可以将liters-变量添加到Cat-类中,并将其传递给谓词。请参阅我上面更新的代码。

您发送的是委托调用的结果,而不是委托,请尝试此版本的代码

class Program
      {
        static void Main(string[] args)
        {
          var cat = new Cat();
          cat
            .ToFeed(1, LikeMilk, c.Inc)
            .ToFeed(2, LikeMilk, c.Inc);
        }
        private static bool LikeMilk(int liters)
        {
          return liters < 1;
        }
      }
      public class Cat
      {
        private int Weith { get; set; }
        public void Inc()
        {
          Weith++;
        }
        public Cat ToFeed(int liters, Func<int, bool> predicate, Action<Cat> action)
        {
          if (predicate(liters))
            action(this);
          return this;
        }
      }
    }