无法将类型为“骰子”的对象转换为类型为“ System.IConvertible”的对象

时间:2019-03-11 00:18:19

标签: c#

我正在尝试做骰子游戏,但由于某种原因会发生此错误。

  

无法将类型为“骰子”的对象转换为类型为“ System.IConvertible”的

这是我的代码:

class Dice
{
    int result;

    public void DiceRoll()
    {
        Random rnd = new Random();
        result = rnd.Next(1, 7);
     }   
}

Console.WriteLine("Player 1 Turn" + roll);
int enterscore1 = Convert.ToInt32(roll);

Console.WriteLine("Player 2 Turn" + roll);
int enterscore2 = Convert.ToInt32(roll);

3 个答案:

答案 0 :(得分:1)

一些注意事项:

  • 在从用户获取输入 (即作为文本)时,您通常会使用Convert.ToInt32int.TryParseint.TryParse中的一种,并且想要获取其数值(作为int值)。

    这里您拥有Dice类的骨骼,该类已经可以与int一起使用,因此无需转换

  • 我会强烈建议您不要尝试像消息所暗示的那样实现IConvertible,这并不是它的真正目的。

  • 请注意,对于像您这样的情况,强烈建议您使用Random的单个实例,因为constructor

      

    使用时间相关的默认种子值。

    因此快速连续创建多个Random实例可能会使用同一种子。如果这样做,由于Random类上的方法不是线程安全的,则应在某个对象上lock,以防止多个线程同时调用其方法(如下所述)。


有几种方法可以做您想要的。这里有一些:

  1. 具有一个Dice的单个实例并将其滚动多次:

    public class Dice
    {
        private static readonly Random random = new Random();
    
        public int Result
        {
            get;
            private set;
        }
    
        public void Roll()
        {
            lock ( random )
                Result = random.Next(1, 7);
        }
    }
    
    public static void Main()
    {
        var dice = new Dice();
    
        dice.Roll();
        var player1Result = dice.Result;
        Console.WriteLine("Player 1 rolls: " + player1Result);
    
        dice.Roll();
        var player2Result = dice.Result;
        Console.WriteLine("Player 2 rolls: " + player2Result);
    }
    

    (尝试here

    请注意,我已经为每个掷骰分配了一个变量-这使您可以使用compare> <来找出谁赢了。

  2. 每个玩家都有一个单独的Dice实例:

    public class Dice
    {
        private static readonly Random random = new Random();
    
        private readonly int _minValue;
        private readonly int _maxValue;
    
        public Dice(int minValue, int maxValue)
        {
            _minValue = minValue;
            _maxValue = maxValue;
        }
    
        public int Result
        {
            get;
            private set;
        }
    
        public void Roll()
        {
            lock ( random )
                Result = random.Next(_minValue, _maxValue + 1);
        }
    }
    
    public static void Main()
    {
        var player1Dice = new Dice(1, 6);
        player1Dice.Roll();
        var player1Result = player1Dice.Result;
        Console.WriteLine("Player 1 rolls: " + player1Result);
    
        var player2Dice = new Dice(1, 5);
        player2Dice.Roll();
        var player2Result = player2Dice.Result;
        Console.WriteLine("Player 2 rolls: " + player2Result);
    }
    

    (尝试here

    您仍然可以进行比较,但是由于您有不同的Dice实例,因此您可以将自己的构造函数添加到Dice中,例如,堆叠赔率以支持一名玩家(我在这里已使第二个玩家的骰子只掷出1-5)。

  3. 只有一个静态Dice

    public static class Dice
    {
        private static readonly Random random = new Random();
    
        public static int Roll()
        {
            lock ( random )
                return random.Next(1, 7);
        }
    }
    
    public static void Main()
    {
        var player1Result = Dice.Roll();
        Console.WriteLine("Player 1 rolls: " + player1Result);
    
        var player2Result = Dice.Roll();
        Console.WriteLine("Player 2 rolls: " + player2Result);
    }
    

    (尝试here

    如果您永远不会对Dice做任何事情,并且不希望它有任何状态(例如,滚动不同的值或了解以前的滚动),则您需要有一个单独的类,这就是我要做的。您不需要构造函数,因为Dicestatic。同样,您可以将这两个结果进行比较。

答案 1 :(得分:0)

如果您将roll作为Dice类的变量声明,则您的代码应为

int enterscore1 = Convert.ToInt32(roll.result);

Console.WriteLine("Player 2 Turn" + roll);
int enterscore2 = Convert.ToInt32(roll.result);

无法将类型为“骰子”的对象转换为类型为“ System.IConvertible”的

此错误意味着您要放置的参数没有IConvertible接口,这对于Convert类方法是必不可少的。

答案 2 :(得分:-1)

您需要包含int enterscore1 = DiceRoll();,这将有助于在骰子掷骰方法中将随机变量定义为整数