[英]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.