【问题标题】:Scoping issues in my C# class我的 C# 类中的范围问题
【发布时间】:2015-10-09 04:32:25
【问题描述】:

我有一门课

public class DiceOnYacht
{
     private static byte numdie = 5;

     // ... 

     private bool isSmallStraight ( byte [numdie] die )
     {
          // ... 
     }
}

并且编译器不喜欢签名使用numdie 的方法,例如上面的方法isSmallStraight。对那些它说的人

错误 CS1525:意外符号 numdie', expecting,' 或 `]'

此外,由于某些奇怪的原因,它与以下表示的行有问题

public byte getAnyScore ( Category cat, byte [numdie] die )
{
    byte score; 
    switch (cat)
    {
        case Category.Ones: 
        case Category.Twos:
        case Category.Threes:
        case Category.Fours:
        case Category.Fives:
        case Category.Sixes:
        case Category.Sevens:
        case Category.Eights:
            score = getSinglesScores(cat,die); 
            break;
        case Category.SmallStraight
            score = isSmallStraight(die) ? 30 : 0; // this line
            break;
        case Category.AllDifferent
            score = die.Distinct().Count() == 5 ? 40 : 0; // and this line
            break;
        case Category.AllSame
            score = die.Distinct.Count() == 1 ? 50 : 0; // and this line
            break;
    }
    return score;
}

因为它说

意外符号“分数”

我想不出这些错误的任何逻辑依据。有什么指导吗?

你可以看到这一切here

【问题讨论】:

  • numdie 不是一种类型,只是一个变量名,所以我认为您不能像那样使用它,尽管我会要求有人确认。第二个错误是你需要':'在每个案例之后,你没有超过 Category.Eight
  • byte[numdie]die 应该做什么。是字节数组吗?您必须在方法内分配其大小
  • @M.kazemAkhgary 我不能在方法的签名中强制数组的大小?
  • 不。内部方法做byte[] die= new byte[numdie];
  • @CarlyFiorina 不,您可以向方法签名添加任何约束。一种方法是将自定义属性添加到参数并在运行时检查它 f.e.或者只做一个简单的 if 并在它无效时抛出 ArgumentException

标签: c# algorithm oop data-structures


【解决方案1】:

数组的大小不能用在参数中。

private bool isSmallStraight ( byte [] die )
{
     //use die  
}

数组上有一些方法可以找到它的维度。

die.Length

非常有用。

更多关于在 C# 中使用数组的信息https://msdn.microsoft.com/en-us/library/aa288453(v=vs.71).aspx

【讨论】:

    【解决方案2】:

    参数中不应提及字节数组的大小。应该如下所示。

    byte[] b = new byte[numdie];
    isSmallStraight(b);   // Calling method 'isSmallStraight'
    
    //...
    
    private bool isSmallStraight ( byte [] die )
    {
    
    }
    

    【讨论】:

    • 传递一个参数然后覆盖它。传递参数根本没有意义。
    【解决方案3】:

    我猜你希望用户传入一个byte 类型和长度为numdie 的数组。但是你不能在参数中做到这一点。您只能在构造数组时指定数组的长度,而不是在声明它时。你可以这样做:

    byte[] array = new byte[numdie];
    

    但不是这个:

    byte[numdie] array;
    

    有一个解决方法:您可以在方法中检查数组的长度。所以你的方法是这样的:

    private bool isSmallStraight (byte[] die)
    { 
        if (die.Length != numdie) {
            throw new ArgumentException ("The length of die is not equal to numdie");
        // ... 
    }
    

    如果长度不合适,抛出异常!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2011-04-18
      • 2023-03-30
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多