2011-05-23 171 views
2

所以我有我的代碼的簡單示例,我無法找到想法如何重寫它。 代碼:Func和不能隱式轉換類型

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

當然我可以改變簽名ToFeedToFeed(bool predicate, Action<Cat> action),但我並不想這樣做。 我知道我必須添加int參數來調用謂詞,但我已將它添加到Main()

我該如何解決此問題?

感謝

回答

4

你一個函數值傳遞給「ToFeed」和不是一個布爾值。這就是爲什麼你需要實際調用該函數:

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

編輯: 現在,我看看你的代碼更近,我看到你硬編碼在主函數升的量和因此拉姆達參數arg是無用的。

你應該在你的主要方法,更改代碼以:

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

現在拉姆達實際使用傳遞的參數。然後,您可以將liters -Variable添加到您傳遞給謂詞的Cat-類。看到我上面更新的代碼。

+0

沒問題。順便說一句...你也可以簡單地在主函數中寫入:.ToFeed(LikeMilk,c => c.Inc())。我沒有寫上述內容,因爲我想強調參數傳遞;) – Christian 2011-05-23 09:35:36

5

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

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語句期望的)。但是,它可以用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將返回相同的事情延遲執行與否。

+0

不,我不想用重量,重量 - 這是重貓:)這就像貓牛奶。我想調用沒有設置int參數的謂詞。我在main()中設置了這個參數。可能嗎? – Ukraine 2011-05-23 09:23:09

+0

@Ukraine:查看我的更新回答 – Christian 2011-05-23 09:24:42

+0

@烏克蘭我看到你找到了你要找的答案:)當你問你的下一個問題時,請包括你想要的東西的正確描述。 – 2011-05-23 09:33:42

0

您發送委託調用,而不是代表的結果,試試這個版本的代碼

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