【问题标题】:Unable to reference class in main无法在 main 中引用类
【发布时间】:2014-02-26 21:50:14
【问题描述】:

前两个参数似乎有效,但是当我添加字符串时出现错误(第 17 行无法将字符串转换为双精度)。我在这里想念什么?从我在书中读到的所有内容来看,这似乎应该有效,所以我猜这是一个愚蠢的错误,但在过去的 3 个小时里我一直在上下查找代码,但没有找到任何东西。感谢您阅读本文!

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication14
{
class Program
{
    static void Main(string[] args)
    {

        SimpleCalc Calc = new SimpleCalc("{0.0}", "{0.0}", "{0}");
        Console.WriteLine(Calc);

    }
  }
}

这是课

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication14
{
class SimpleCalc
{

        public SimpleCalc(double num1, double num2, string oper)
        {

            Console.Write("Enter first integer: ");
            num1 = Convert.ToDouble(Console.ReadLine());

            Console.Write("Enter operator (+,-,*, / or %)");
            oper = Convert.ToString(Console.ReadLine());

            Console.Write("Enter second integer: ");
            num2 = Convert.ToDouble(Console.ReadLine());

            if (oper == "+")
                Console.Write("Answer is: {0}", num1 + num2);

            if (oper == "-")
                Console.Write("Answer is: {0}", num1 - num2);

            if (oper == "*")
                Console.Write("Answer is: {0}", num1 * num2);

            if (oper == "/")
                Console.Write("Answer is: {0}", num1 / num2);

            if (oper == "%")
                Console.Write("Answer is: {0}", num1 % num2);

            Console.ReadKey();
        }
    }
}

【问题讨论】:

  • @NitinVarpe:不,对于顶级类型,默认情况下它是内部的。
  • 它也在同一个命名空间中..
  • -1 因为没有告诉我们错误消息以及它发生在哪一行代码上。您可以看到错误消息。为什么要拒​​绝我们提供这些信息?
  • 我认为您应该阅读有关参数的内容。通常为num1 之类的输入参数赋值是个坏主意。
  • @DavidHeffernan Rog。已添加。

标签: c# class main


【解决方案1】:

问题是你的构造函数需要两个双精度和一个字符串:

public SimpleCalc(double num1, double num2, string oper)

但是你用三个字符串来调用它:

SimpleCalc Calc = new SimpleCalc("{0.0}", "{0.0}", "{0}");

将其更改为:

SimpleCalc calc = new SimpleCalc(0.0, 0.0, "{0}");

在编译方面应该没问题。 (在构造函数中与用户交互并忽略传入参数的值是不好的,但那是另一回事。)

另请注意,我已将局部变量的名称从 Calc 更改为 calc 以遵循正常的 C# 约定。

【讨论】:

  • 是的,不知道我是怎么忘记的。我知道这是一个愚蠢的错误,哈哈。谢谢大佬!
  • @JonSkeet 你把它从 Calc 改成了 calc :)
  • @NitinVarpe:在描述中,我假设您的意思是?固定。
  • @JonSkeet 对不起,但没有得到你。我只是指出输入错误
【解决方案2】:

您的SimpleCalc 构造函数需要doubles 和一个string 最后..您只传递字符串。

所以,不要这样:

SimpleCalc Calc = new SimpleCalc("{0.0}", "{0.0}", "{0}");

你应该这样做:

SimpleCalc Calc = new SimpleCalc(0.0, 0.0, "0");

【讨论】:

    【解决方案3】:

    首先你是一些转换错误字符串加倍并使用无效参数重载。

    其次,您将参数传递给构造函数但不使用它们?

    也许你想要

        static void Main(string[] args)
        {
            SimpleCalc Calc = new SimpleCalc();
            Console.WriteLine(Calc);
        }
    

    和构造函数为

        public SimpleCalc()
        {
            double num1;
            double num2;
            string oper;
    
            Console.Write("Enter first integer: ");
            num1 = Convert.ToDouble(Console.ReadLine());
    
            Console.Write("Enter operator (+,-,*, / or %)");
            oper = Convert.ToString(Console.ReadLine());
    
            Console.Write("Enter second integer: ");
            num2 = Convert.ToDouble(Console.ReadLine());
    
            if (oper == "+")
                Console.Write("Answer is: {0}", num1 + num2);
    
            if (oper == "-")
                Console.Write("Answer is: {0}", num1 - num2);
    
            if (oper == "*")
                Console.Write("Answer is: {0}", num1 * num2);
    
            if (oper == "/")
                Console.Write("Answer is: {0}", num1 / num2);
    
            if (oper == "%")
                Console.Write("Answer is: {0}", num1 % num2);
    
            Console.ReadKey();
        }
    

    【讨论】:

      【解决方案4】:

      您需要传递您在方法中启动的正确类型的参数。参考下面的代码。

      SimpleCalc Calc = new SimpleCalc(0.0, 0.0, "0");

      你可以像下面这样通过。

      SimpleCalc Calc = new SimpleCalc("{0.0}", "{0.0}", "{0}");

      但是你需要像下面这样创建方法

      class SimpleCalc
      {
          public SimpleCalc(string num1, string num2, string oper)
          {
              //............
          }
      }
      

      【讨论】:

        【解决方案5】:

        您的代码有多个错误。如果您从获得此参数的Main 函数发送parameters。如果您从Main 函数发送参数,为什么要在SimpleCalc 函数中从控制台读取它。

        首先从SimpleCalc函数中删除读取部分到Main

        static void Main(string[] args)
        {
            double num1;
            double num2;
            string oper;
        
            Console.Write("Enter first integer: ");
            num1 = Convert.ToDouble(Console.ReadLine());
        
            Console.Write("Enter operator (+,-,*, / or %)");
            oper = Convert.ToString(Console.ReadLine());
        
            Console.Write("Enter second integer: ");
            num2 = Convert.ToDouble(Console.ReadLine());
        
            SimpleCalc Calc = new SimpleCalc(num1,num2,oper);
            Console.WriteLine(Calc);
        }
        

        并从函数中删除阅读部分,使其简单明了

            public SimpleCalc(double num1, double num2, string oper)
            {
        
                if (oper == "+")
                    Console.Write("Answer is: {0}", num1 + num2);
        
                if (oper == "-")
                    Console.Write("Answer is: {0}", num1 - num2);
        
                if (oper == "*")
                    Console.Write("Answer is: {0}", num1 * num2);
        
                if (oper == "/")
                    Console.Write("Answer is: {0}", num1 / num2);
        
                if (oper == "%")
                    Console.Write("Answer is: {0}", num1 % num2);
        
                Console.ReadKey();
            }
        

        【讨论】:

          【解决方案6】:

          由于每个人都已经指出了传递给类的构造函数的参数类型的问题,我希望在你的代码中指出一个逻辑问题

          传递给 SimpleCalc 构造函数的参数成为构造函数内的局部变量,根本不使用,因为您要求用户为它们键入值。那么为什么一开始就通过它们呢?我还发现你的类的所有工作都在构造函数中执行的事实不是一个很好的例子(在没有任何验证的情况下也接受输入)。

          也许你应该使用不同的方法

          static void Main(string[] args)
          {
              // To keep short, I have not added any validation, but the user input
              // should always validated See double.TryParse 
          
              Console.Write("Enter first integer: ");
              double num1 = Convert.ToDouble(Console.ReadLine());
          
              Console.Write("Enter operator (+,-,*, / or %)");
              string oper = Convert.ToString(Console.ReadLine());
          
              Console.Write("Enter second integer: ");
              double num2 = Convert.ToDouble(Console.ReadLine());
              SimpleCalc calc = new SimpleCalc(num1, num2, oper);
              double result = calc.Execute();
              Console.WriteLine("Answer is: {0}", result);
          }
          
          class SimpleCalc
          {
              double _num1;
              double _num2;
              string _oper;
              public SimpleCalc(double num1, double num2, string oper)
              {
                  _num1 = num1;
                  _oper = oper;
                  _num2 = num2;
              }
              public double Execute()
              {        
                  if (oper == "+")
                      return num1 + num2;
          
                  else if (oper == "-")
                      return num1 - num2;
          
                  else if (oper == "*")
                      return num1 * num2;
          
                  else if (oper == "/")
                      return num1 / num2;
          
                  else if (oper == "%")
                      return num1 % num2;
          
                  else 
                       throw new ArgumentException("Invalid operator: " + oper);
              }
          }
          

          【讨论】:

            【解决方案7】:

            你应该如下使用它 SimpleCalc Calc = new SimpleCalc(0.0, 0.0, "{0}");

            因为您的班级期望前两个参数为双精度,第三个参数为字符串

            【讨论】:

            • 我不是提问者:)
            猜你喜欢
            • 2013-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-12
            • 2020-05-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多