簡體   English   中英

Func並不能隱式轉換類型

[英]Func and Cannot implicitly convert type

所以我有我的代碼的簡單示例,我不知道如何重寫它。 碼:

 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()添加了它

我怎么解決這個問題?

謝謝

我相信你的方法應該是這樣的:

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;
}

predicate(Weith)使用屬性Weith的值執行函數predicate 一個Func<int, bool>本身並不是一個bool(true / false - 這就是if-sentence所期望的。)但是,你可以用int作為參數執行它來獲取bool,因此你需要(arguments)

更新:

我不完全確定你想要什么。 但你可以像你說的那樣做,並使用bool而不是Func<*> 如果您希望延遲對LikeMilk的評估,可以這樣說:

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'而不是bool值 這就是你需要實際調用函數的原因:

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

編輯:現在我仔細查看你的代碼,我看到你硬編碼了main函數中的升數量,因此lambda參數arg是無用的。

您應該將main方法中的代碼更改為:

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

現在lambda實際上使用了傳遞的參數。 然后,你可以添加一個liters -Variable你的Cat -class其中傳遞謂詞。 請參閱上面的更新代碼。

您發送委托調用的結果而不是委托,嘗試此版本的代碼

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;
        }
      }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM