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

Cla*_*nry 1 c# constructor initialization class

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

我不是高级程序员,但我有相当数量的C++经验.我正在尝试学习C#并且在使用非常基本的语法方面遇到麻烦,特别是对于访问其他类.我一直在寻找简单的例子,而且绝大多数情况下,我发现的所有东西似乎都使用了一个巨大的类,其中使用了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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我只想在另一个文件Program.cs中测试它.我打2个错误,无法弄清楚原因.我在尝试初始化经销商课程时遇到了很多麻烦.另外,我只想在Dealer类中测试一个getter函数.

我总是使用更多的静态和私有关键字,但是当我遇到错误时把它们拿走了.

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...
            }


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

很抱歉这些基本问题,但我一直在搜索互联网并尝试不同的方法来解决这个问题并且没有成功.我觉得一旦我克服了这些错误,我应该能够相对轻松地转换我的许多其他代码.

Dav*_*d L 5

你的构造函数是隐式私有的,因为你提供零公共构造函数,它不能实例化你的类,即使类本身是公共的..

您需要指定它是公共的.

public Dealer() { }
Run Code Online (Sandbox Code Playgroud)

至于你的第二个问题,你不需要告诉你的方法它们属于这个类.他们已经意识到了.像这样更改方法签名:

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

请注意,现在该方法是公开的,并且我们的范围正确.另外,请注意方法名称上的PascalCasing.这是C#中方法名称的适当命名约定.

另外,另一方面,由于C#是托管语言,您可能不需要析构函数.