C# 使用'统计浮点加法;代表浮动';

C# 使用'统计浮点加法;代表浮动';,c#,delegates,C#,Delegates,我正在建立一个统计系统。在系统中,某些属性依赖于其他属性来计算其最终值。以下是我对此的最初尝试: public class ModdedStat { public delegate float Mod(); public Mod mod; public float baseStat; public float finalStat { get { return baseStat + mod();

我正在建立一个统计系统。在系统中,某些属性依赖于其他属性来计算其最终值。以下是我对此的最初尝试:

public class ModdedStat
{
    public delegate float Mod();
    public Mod mod;
    public float baseStat;
    public float finalStat
    {
        get
        {
            return baseStat + mod();
        }
    }
}
不幸的是,这是return baseStat+最后一个订阅mod的侦听器。我测试如下:

stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);
Out1和Out2是分别返回1和2的函数。控制台写入返回“2”

我以前从未使用过返回类型委托,所以我不确定我的逻辑出了什么问题。有没有类似的解决方案,甚至是完全不同的解决方案


谢谢你的帮助

发生这种情况是因为默认情况下,调用多播将运行您使用
+=
添加的所有代理,但返回的值将是您上次添加的代理的返回值。毕竟,一个调用只能返回一个值

如果需要输出
3
,可以使用获取使用
+=
添加到多播代理的代理。然后,您可以在数组中循环并添加返回值

public float finalStat
{
    get
    {
        float totalMod = 0;
        foreach(Mod m in mod.GetInvocationList()) {
            totalMod += m();
        }
        return baseStat + totalMod;
    }
}

这是因为默认情况下,调用多播将运行您使用
+=
添加的所有代理,但返回的值将是您上次添加的代理的返回值。毕竟,一个调用只能返回一个值

如果需要输出
3
,可以使用获取使用
+=
添加到多播代理的代理。然后,您可以在数组中循环并添加返回值

public float finalStat
{
    get
    {
        float totalMod = 0;
        foreach(Mod m in mod.GetInvocationList()) {
            totalMod += m();
        }
        return baseStat + totalMod;
    }
}

对于这种情况,使用
delegate
GetInvocationList
的替代方法是
Func

var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);

funcs.Sum(f => f());

对于这种情况,使用
delegate
GetInvocationList
的替代方法是
Func

var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);

funcs.Sum(f => f());

你太棒了!非常感谢你的快速反应:)你太棒了!非常感谢您的快速结果:)答案如下