简体   繁体   English

无法隐式转换类型'System.Action<mathstester.program.operationquestionscore> ' 到 'mathtester.Program.OperationQuestionScore'</mathstester.program.operationquestionscore>

[英]Cannot implicitly convert type 'System.Action<mathstester.Program.OperationQuestionScore>' to 'mathstester.Program.OperationQuestionScore'

I made a C# console math project where the user answers addition, subtraction, multiplication, division, power or square-root questions based on the difficulty they choose!我制作了一个 C# 控制台数学项目,用户根据他们选择的难度回答加法、减法、乘法、除法、幂或平方根问题!

Here is my full code:这是我的完整代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace mathstester
{
    class Program
    {
        public enum UserDifficulty
        {
            Easy,
            Normal,
            Hard
        }

        public enum MathOperation
        {
            Addition = 1,
            Subtraction = 2,
            Multiplication = 3,
            Division = 4,
            Power = 5,
            SquareRoot = 6
        }
        public static (int operationMin, int operationMax) GetPossibleOperationsByDifficulty(UserDifficulty userDifficulty)
        {

            switch (userDifficulty)
            {
                case UserDifficulty.Easy:
                    return (1, 4);
                case UserDifficulty.Normal:
                    return (1, 5);
                case UserDifficulty.Hard:
                    return (3, 7);
                default:
                    throw new Exception();
            }
        }

        public class OperationQuestionScore
        {
            public int AdditionQuestion { get; set; }
            public int AdditionScore { get; set; }
            public int SubtractionQuestion { get; set; }
            public int SubtractionScore { get; set; }
            public int MultiplicationQuestion { get; set; }
            public int MultiplicationScore { get; set; }
            public int DivisionQuestion { get; set; }
            public int DivisionScore { get; set; }
            public int PowerQuestion { get; set; }
            public int PowerScore { get; set; }
            public int SquareRootQuestion { get; set; }
            public int SquareRootScore { get; set; }

            public static (OperationQuestionScore, OperationQuestionScore) Scores(MathOperation mathOperation)
            {
                Action<OperationQuestionScore> incrementOperationQuestion;
                Action<OperationQuestionScore> incrementOperationScore;
                switch (mathOperation)
                {
                    case MathOperation.Addition:
                        incrementOperationQuestion = incrementquestion => incrementquestion.AdditionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.AdditionScore++;
                    case MathOperation.Subtraction:
                        incrementOperationQuestion = incrementquestion => incrementquestion.SubtractionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.SubtractionScore++;
                        break;
                    case MathOperation.Multiplication:
                        incrementOperationQuestion = incrementquestion => incrementquestion.MultiplicationQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.MultiplicationScore++;
                        break;
                    case MathOperation.Division:
                        incrementOperationQuestion = incrementquestion => incrementquestion.DivisionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.DivisionScore++;
                        break;
                    case MathOperation.Power:
                        incrementOperationQuestion = incrementquestion => incrementquestion.PowerQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.PowerScore++;
                        break;
                    case MathOperation.SquareRoot:
                        incrementOperationQuestion = incrementquestion => incrementquestion.SquareRootQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.SquareRootScore++;
                        break;
                    default:
                        break;
                }
                return (incrementOperationQuestion, incrementOperationScore);
            }
        }

        public static OperationQuestionScore Score()
        {
            return new OperationQuestionScore();
        }

        public static (string message, double correctAnswer) GetMathsEquation(MathOperation mathOperation, UserDifficulty userDifficulty)
        {
            int number1;
            int number2;
            Random randomNumber = new Random();

            switch (mathOperation)
            {
                case MathOperation.Addition:
                    number1 = randomNumber.Next(1000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} + {number2}", number1 + number2);
                case MathOperation.Subtraction:
                    number1 = randomNumber.Next(1000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} - {number2}", number1 - number2);
                case MathOperation.Multiplication:
                    number1 = userDifficulty == UserDifficulty.Easy ? randomNumber.Next(13) : randomNumber.Next(1000);
                    number2 = userDifficulty == UserDifficulty.Easy ? randomNumber.Next(13) : randomNumber.Next(1000);
                    return ($"{number1} * {number2}", number1 * number2);
                case MathOperation.Division:
                    number1 = randomNumber.Next(10000);
                    number2 = randomNumber.Next(1000);
                    return ($"{number1} / {number2}", number1 / (double)number2);
                case MathOperation.Power:
                    number1 = randomNumber.Next(13);
                    number2 = randomNumber.Next(5);
                    return ($"{number1} ^ {number2}", Math.Pow(number1, number2));
                case MathOperation.SquareRoot:
                    number1 = randomNumber.Next(1000);
                    return ($"√{number1}", Math.Sqrt(number1));
                default:
                    throw new Exception();
            }
        }

        public static (int, OperationQuestionScore, OperationQuestionScore) RunTest(int numberOfQuestionsLeft, UserDifficulty userDifficulty)
        {
            int totalScore = 0;
            Random random = new Random();
            var (operationMin, operationMax) = GetPossibleOperationsByDifficulty(userDifficulty);
            var score = Score();
            var question = Score();
            var (incrementOperationQuestion, incrementOperationScore) = Scores();
            while (numberOfQuestionsLeft > 0)
            {
                int mathRandomOperation = random.Next(operationMin, operationMax);
                MathOperation mathOperation = (MathOperation)mathRandomOperation;
                var (message, correctAnswer) = GetMathsEquation(mathOperation, userDifficulty);
                if (mathRandomOperation == 4 || mathRandomOperation == 6)
                {
                    Console.Write($"To the nearest integer, What is {message} =");
                }
                else
                {
                    Console.Write($"What is {message} =");
                }
                double userAnswer = Convert.ToDouble(Console.ReadLine());
                if (Math.Round(correctAnswer) == userAnswer)
                {
                    Console.WriteLine("Well Done!");
                    incrementOperationQuestion(question);
                    incrementOperationScore(score);
                    totalScore++;
                }
                else
                {
                    Console.WriteLine("Your answer is incorrect!");
                    incrementOperationQuestion(question);
                }
                numberOfQuestionsLeft--;
            }
            return (totalScore, score, question);
        }
        public static void Main(string[] args)
        {
            Dictionary<string, UserDifficulty> difficultyDictionary = new Dictionary<string, UserDifficulty>();
            difficultyDictionary.Add("E", UserDifficulty.Easy);
            difficultyDictionary.Add("N", UserDifficulty.Normal);
            difficultyDictionary.Add("H", UserDifficulty.Hard);

            string userInputDifficulty = "";
            do
            {
                Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
                userInputDifficulty = Console.ReadLine().ToUpper();
            } while (userInputDifficulty != "E" && userInputDifficulty != "N" && userInputDifficulty != "H");

            UserDifficulty userDifficulty = difficultyDictionary[userInputDifficulty];

            int numberOfQuestions = 0;
            do
            {
                Console.WriteLine("How many questions would you like to answer? Please type a number divisible by 10!");
                int.TryParse(Console.ReadLine(), out numberOfQuestions);
            } while (numberOfQuestions % 10 != 0);

            var (totalScore, score, question) = RunTest(numberOfQuestions, userDifficulty);
            Console.WriteLine($"Total score: {totalScore} of {numberOfQuestions}");

            if (userDifficulty == UserDifficulty.Easy)
            {
                Console.WriteLine($"Addition score: {score.AdditionScore} of {question.AdditionQuestion}");
                Console.WriteLine($"Subtraction score: {score.SubtractionScore} of {question.SubtractionQuestion}");
                Console.WriteLine($"Multiplication score: {score.MultiplicationScore} of {question.MultiplicationQuestion}");
            }
            else if (userDifficulty == UserDifficulty.Normal)
            {
                Console.WriteLine($"Addition score: {score.AdditionScore} of {question.AdditionQuestion}");
                Console.WriteLine($"Subtraction score: {score.SubtractionScore} of {question.SubtractionQuestion}");
                Console.WriteLine($"Multiplication score: {score.MultiplicationScore} of {question.MultiplicationQuestion}");
                Console.WriteLine($"Division score: {score.DivisionScore} of {question.DivisionQuestion}");
            }
            else if (userDifficulty == UserDifficulty.Hard)
            {
                Console.WriteLine($"Multipication score: {score.MultiplicationScore} of {question.MultiplicationQuestion}");
                Console.WriteLine($"Division score: {score.DivisionScore} of {question.DivisionQuestion}");
                Console.WriteLine($"Power score: {score.PowerScore} of {question.PowerQuestion}");
                Console.WriteLine($"Squareroot score: {score.SquareRootScore} of {question.SquareRootQuestion}");
            }
        }
    }
}

Here is where my problem is:这是我的问题所在:

public static (OperationQuestionScore, OperationQuestionScore) Scores(MathOperation mathOperation)
            {
                Action<OperationQuestionScore> incrementOperationQuestion;
                Action<OperationQuestionScore> incrementOperationScore;
                switch (mathOperation)
                {
                    case MathOperation.Addition:
                        incrementOperationQuestion = incrementquestion => incrementquestion.AdditionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.AdditionScore++;
                    case MathOperation.Subtraction:
                        incrementOperationQuestion = incrementquestion => incrementquestion.SubtractionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.SubtractionScore++;
                        break;
                    case MathOperation.Multiplication:
                        incrementOperationQuestion = incrementquestion => incrementquestion.MultiplicationQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.MultiplicationScore++;
                        break;
                    case MathOperation.Division:
                        incrementOperationQuestion = incrementquestion => incrementquestion.DivisionQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.DivisionScore++;
                        break;
                    case MathOperation.Power:
                        incrementOperationQuestion = incrementquestion => incrementquestion.PowerQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.PowerScore++;
                        break;
                    case MathOperation.SquareRoot:
                        incrementOperationQuestion = incrementquestion => incrementquestion.SquareRootQuestion++;
                        incrementOperationScore = incrementscore => incrementscore.SquareRootScore++;
                        break;
                    default:
                        break;
                }
                return (incrementOperationQuestion, incrementOperationScore);
            }

In my function "Score" I have an error with the return (incrementOperationQuestion, incrementOperationScore);在我的 function “Score”中,我的return (incrementOperationQuestion, incrementOperationScore); . .

The error says错误说

1. Cannot implicitly convert type 'System.Action<mathstester.Program.OperationQuestionScore>'
    to 'mathstester.Program.OperationQuestionScore'

2. Use of unassigned local variable 'incerementOperationScore'

How do I fix this?我该如何解决?

Cannot implicitly convert type 'System.Action' to 'mathstester.Program.OperationQuestionScore'无法将类型“System.Action”隐式转换为“mathtester.Program.OperationQuestionScore”

This error occurs because method Scores is declared to return a tuple of type (OperationQuestionScore, OperationQuestionScore) but it actually returns a tuple of type (Action<OperationQuestionScore>, Action<OperationQuestionScore>) .发生此错误是因为方法Scores被声明为返回类型为(OperationQuestionScore, OperationQuestionScore)的元组,但它实际上返回类型为(Action<OperationQuestionScore>, Action<OperationQuestionScore>)的元组。 To fix this problem you should change the return type of the method Scores :要解决此问题,您应该更改方法Scores的返回类型:

public static (Action<OperationQuestionScore>, Action<OperationQuestionScore>) Scores(MathOperation mathOperation)

Use of unassigned local variable 'incerementOperationScore'使用未分配的局部变量“incerementOperationScore”

Such error indicates that there is a usage of a variable that was not assigned to a value.此类错误表明使用了未分配给值的变量。 In your case compiler tells that there is a possibility of using unassigned variable incerementOperationScore .在您的情况下,编译器告诉您有可能使用未分配的变量incerementOperationScore It can occur if an argument mathOperation does not match any of the switch cases, and empty default case does not assign a value to incerementOperationScore .如果参数mathOperation与任何 switch 案例不匹配,并且空的default案例没有为incerementOperationScore分配值,则可能会发生这种情况。 At the moment all possible mathOperation values are handled by switch statement and it is implied that default branch will never execute.目前所有可能的mathOperation值都由 switch 语句处理,这意味着default分支永远不会执行。 But in future you could add a new math operation and forget to add it to this switch statement.但是将来您可能会添加一个新的数学运算而忘记将其添加到此 switch 语句中。 To prevent such errors compiler forces us to handle all possible case values (even if we'll add them in future).为了防止此类错误,编译器会强制我们处理所有可能的大小写值(即使我们将来会添加它们)。

To fix this problem you should either throw an exception in the default case:要解决此问题,您应该在default情况下抛出异常:

default:
    throw new System.ComponentModel.InvalidEnumArgumentException("mathOperation", (int) mathOperation, typeof(MathOperation));

or handle one of the MathOperation values in the default case:或在default情况下处理MathOperation值之一:

default: // For example, use default branch instead of MathOperation.SquareRoot branch.
    incrementOperationQuestion = incrementquestion => incrementquestion.SquareRootQuestion++;
    incrementOperationScore = incrementscore => incrementscore.SquareRootScore++;
    break;

Personally I prefer to throw an exception.我个人更喜欢抛出异常。 It helps to handle situations when you forget to add a new case branch for newly added enum value.当您忘记为新添加的枚举值添加新的案例分支时,它有助于处理情况。


There is also another error in the Scores method. Scores方法中还有另一个错误。 break keyword is missed in the first case branch.第一个 case 分支中缺少break关键字。


Here is complete Scores method with fixed errors:这是具有固定错误的完整Scores方法:

public static (Action<OperationQuestionScore>, Action<OperationQuestionScore>) Scores(MathOperation mathOperation)
{
    Action<OperationQuestionScore> incrementOperationQuestion;
    Action<OperationQuestionScore> incrementOperationScore;
    switch (mathOperation)
    {
       case MathOperation.Addition:
          incrementOperationQuestion = incrementquestion => incrementquestion.AdditionQuestion++;
          incrementOperationScore = incrementscore => incrementscore.AdditionScore++;
          break;
       case MathOperation.Subtraction:
          incrementOperationQuestion = incrementquestion => incrementquestion.SubtractionQuestion++;
          incrementOperationScore = incrementscore => incrementscore.SubtractionScore++;
          break;
       case MathOperation.Multiplication:
          incrementOperationQuestion = incrementquestion => incrementquestion.MultiplicationQuestion++;
          incrementOperationScore = incrementscore => incrementscore.MultiplicationScore++;
          break;
       case MathOperation.Division:
          incrementOperationQuestion = incrementquestion => incrementquestion.DivisionQuestion++;
          incrementOperationScore = incrementscore => incrementscore.DivisionScore++;
          break;
       case MathOperation.Power:
          incrementOperationQuestion = incrementquestion => incrementquestion.PowerQuestion++;
          incrementOperationScore = incrementscore => incrementscore.PowerScore++;
          break;
       case MathOperation.SquareRoot:
          incrementOperationQuestion = incrementquestion => incrementquestion.SquareRootQuestion++;
          incrementOperationScore = incrementscore => incrementscore.SquareRootScore++;
          break;
       default:
          throw new InvalidEnumArgumentException("mathOperation", (int) mathOperation, typeof(MathOperation));
    }
    return (incrementOperationQuestion, incrementOperationScore);
}

@crazydanyal1414 asked in the comment: @crazydanyal1414 在评论中问:

But how would I define the "Scores" function into "RunTest"?但是我如何将“分数”function 定义为“RunTest”?

A minor change to the method RunTest is needed.需要对RunTest方法进行细微更改。 Here is changed method RunTest .这是更改方法RunTest I described made changes in the comments:我在评论中描述了所做的更改:

public static (int, OperationQuestionScore, OperationQuestionScore) RunTest(int numberOfQuestionsLeft, UserDifficulty userDifficulty)
{
    int totalScore = 0;
    Random random = new Random();
    var (operationMin, operationMax) = GetPossibleOperationsByDifficulty(userDifficulty);
    var score = Score();
    var question = Score();

    // Move this line into the while loop.
    //var (incrementOperationQuestion, incrementOperationScore) = Scores();

    while (numberOfQuestionsLeft > 0)
    {
        int mathRandomOperation = random.Next(operationMin, operationMax);
        MathOperation mathOperation = (MathOperation)mathRandomOperation;
        var (message, correctAnswer) = GetMathsEquation(mathOperation, userDifficulty);
        if (mathRandomOperation == 4 || mathRandomOperation == 6)
        {
           Console.Write($"To the nearest integer, What is {message} =");
        }
        else
        {
           Console.Write($"What is {message} =");
        }

        // Here is moved line.
        // Method Scores must be invoked using static method invocation
        // syntax, and a parameter mathOperation must be passed into it.
        var (incrementOperationQuestion, incrementOperationScore) = OperationQuestionScore.Scores(mathOperation);

        double userAnswer = Convert.ToDouble(Console.ReadLine());
        if (Math.Round(correctAnswer) == userAnswer)
        {
           Console.WriteLine("Well Done!");
           incrementOperationQuestion(question);
           incrementOperationScore(score);
           totalScore++;
        }
        else
        {
           Console.WriteLine("Your answer is incorrect!");
           incrementOperationQuestion(question);
        }
        numberOfQuestionsLeft--;
     }
     return (totalScore, score, question);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法将类型&#39;void&#39;隐式转换为System.Action <int> - Cannot implicitly convert type 'void' to System.Action<int> Unity - 输入系统给我一条错误消息“无法将类型‘void’隐式转换为‘System.Action(...)’” - Unity - Input System giving me an error message "Cannot implicitly convert type 'void' to 'System.Action(...)" 无法将类型'Program.Data.View'隐式转换为System.linq.iqueryable <Program.Data.View>。 - Cannot implicitly convert type 'Program.Data.View' TO System.linq.iqueryable<Program.Data.View>. CS1503:参数 2:无法从 &#39;System.Action[*,*,*] 转换为 System.Action[]&#39; C# 2022 - CS1503: Argument 2: Cannot convert from 'System.Action[*,*,*] to System.Action[]' C# 2022 将委托转换为System.Action - Convert delegate to System.Action 注册商无法编组 xamarin iOS 中的参数类型“system.action” - the registrar cannot marshal the parameter type 'system.action' in xamarin iOS C# 无法从“字符串”转换为“System.Action”<string> &#39; - C# Cannot convert from 'string' to 'System.Action<string>' 无法从'方法组'转换为'System.Action <object>'错误 - Cannot convert from 'method group' to 'System.Action<object>' error 无法将Lambda表达式转换为类型&#39;System.Linq.Expressions.Expression <System.Action> &#39;,因为它不是委托类型。 hangfire中的错误 - Cannot convert lambda expression to type ‘System.Linq.Expressions.Expression<System.Action>’ because it is not a delegate type. error in hangfire 无法从“无效”转换为System.Threading.Tasks.Task <System.Action> - Cannot convert from 'void' to System.Threading.Tasks.Task<System.Action>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM