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()
中添加了它
我该如何解决这个问题?
感谢
我认为您的方法应该是这样的:
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',而不是布尔值 编辑:现在我仔细看一下你的代码,我发现你在主函数中对升的数量进行了硬编码,因此lambda参数 您应该将主方法中的代码更改为: 现在lambda实际上使用了传递的参数。然后,您可以将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
-变量添加到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;
}
}
}