C# 新手,在使用 C# 枚举和强制转换进行计算时遇到问题

New to C#, having trouble with calculations with C# enums and casting

我是 C# 的新手,很难弄清楚为什么我对这个函数的单元测试总是失败。

我有一个枚举(这都是例子,但你明白了要点):

public enum TeamActions 
{
   TeamWasScoredAgainst = - 10,
   TeamScored = 10
}

然后我有一个静态 TeamHelper class,它通过评估 TeamAction 是否在我的 Team 对象上计算 TeamScore 的 long正值与否,所以我知道是否要从 运行 TeamScore 总数中添加或减去。

public class Team
{
  public long TeamScore {get; set;}
}

public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
    if (team == null) throw new ArgumentNullException("Team is null");
    if ((int)teamAction < 1)
    {
       return team.TeamScore - Convert.ToInt64((int)teamAction);
    }
    else
    {
       return team.TeamScore + Convert.ToInt64((int)teamAction);
    }
}

我的 xUnit 测试失败了:

public void TeamWasScoredAgainst_ShouldDecreaseScore()
{
    // arrange
    var teamUnderTest = new Team
    {
      TeamScore = 100
    };

    // act
    teamUnderTest.TeamScore = TeamHelper.CalcNewTeamScore(teamUnderTest, TeamAction.TeamWasScoredAgainst);

    // assert
    Assert.Equal(90, teamUnderTest.TeamScore);
}

我真的不确定我的测试是否错误(第一次做),或者 TeamHelper 方法转换错误,或者数学本身是错误的。有帮助吗?

你的数学错了。

由于您的枚举值本身已经是负数,从其他东西中减去它,实际上会增加结果。

你应该改变

public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
    if (team == null) throw new ArgumentNullException("Team is null");
    if ((int)teamAction < 1)
    {
       // Convert.ToInt64((int)teamAction) = -10
       // you actually have 100 - (-10) => 110
       return team.TeamScore - Convert.ToInt64((int)teamAction);
    }
    else
    {
       return team.TeamScore + Convert.ToInt64((int)teamAction);
    }
}

public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
    if (team == null) throw new ArgumentNullException("Team is null");    
    return team.TeamScore + Convert.ToInt64((int)teamAction);    
}

你的代码中的问题是 teamAction 可以是负数,你减去负值。如果你从一个数字中减去一个负值,结果会比你减去的数字大。

显示问题的较短示例:

var negativeValue = -10;
var result = 10 - negativeValue;
Assert.Equal(20, result);

这就像现实世界中的数学一样。

x = 10 - (-10)
x = 10 + 10
x = 20

您的代码完全按照您编程的方式执行。

如果我猜的话,我会说你想在你的球队输球时减去 10。

但是您所做的是添加这个额外的 if 以确保当枚举为 negative 时,它会 subtracted.但是如果你从某物中减去“-10”,你实际上是在加 10。

“X - (-10)”是“X + 10”。

所以您可能希望将此 if 全部删除并始终添加枚举值。当枚举值为 -10 时,将减去 10。