繁体   English   中英

无法使用构造函数实例化类

[英]Unable to instantiate class with constructor

我敢肯定这是重复的,但是经过几个小时的搜索/尝试后,我一直无法找到解决方法。

我不是高级程序员,但是我有相当多的C ++经验。 我正在尝试学习C#,并且在使用非常基本的语法时遇到了麻烦,尤其是对于仅访问其他类的情况。 一段时间以来,我一直在寻找简单的示例,并且绝大多数情况下,我发现的所有内容似乎都使用一个HUGE类,其中使用了main方法,因此这些示例并不是很有帮助。

我想开发一个包含多个.cs文件(每个类一个)和另一个包含我将用于测试的主要方法的.cs文件的解决方案。 我的解决方案名为DIVAT。 我有一个使用以下代码的Dealer.cs文件:

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

namespace DIVAT
{
    public class Dealer
    {
        public List<Tuple<int, string>> deck;

        Dealer()
        { // default constructor
            Console.Out.WriteLine("Default constructor called. (Dealer class)");

            string [] suitValue = {"c", "d", "h", "s"};

            for(int i = 2; i <= 14; i++){
                for(int j = 0; j <= 3; j++){
                    deck.Add(new Tuple<int, string>(i, suitValue[j]));
                }            
            }
        }

        ~Dealer() 
        {// destructor
            Console.Out.WriteLine("Destrcutor called. (Dealer class)");
        }

        Tuple<int, string> Dealer.getCard(int cardNum)
        {// getter
            return deck[cardNum];
        }
    }
}

现在,我只是想在另一个文件Program.cs中对此进行测试。 我遇到了2个错误,无法弄清原因。 我在尝试初始化Dealer类时遇到很多麻烦。 另外,我只想在Dealer类中测试getter函数。

我曾经在整个过程中使用了更多的静态和私有关键字,但是当我遇到bug时就把它们删除了。

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

namespace DIVAT
{
    class Program
    {
        static void Main(string[] args)
        {
            Dealer dealer = new Dealer();
            // inaccessible due to it's protection level...

            for (int i = 0; i <= 52; i++) {                
                Console.Out.WriteLine(dealer.getCard(i));
                // does not contain a definition for getCard...
            }


        }
    }
}

很抱歉遇到这样的基本问题,但是我一直在搜寻互联网,并尝试以其他方式解决此问题,但未成功。 我觉得一旦克服了这几个错误,我就应该能够相对轻松地转换很多其他代码。

您的构造函数是隐式私有的,并且由于您提供了零个公共构造函数,因此即使类本身是公共的,它也无法实例化您的类。

您需要指定它是公共的。

public Dealer() { }

至于第二个问题,您不需要告诉您的方法它们属于该类。 他们已经知道了。 像这样更改方法签名:

public Tuple<int, string> GetCard(int cardNum)
{
    // getter
    return deck[cardNum];
}

请注意,现在该方法是公共的,并且我们的作用域范围正确。 此外,请在您的方法名称上注意PascalCasing。 这是C#中方法名称的适当命名约定。

另外,请注意,由于C#是托管语言,因此您可能不需要析构函数。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM