声明C#struct的对象

时间:2018-03-29 13:55:25

标签: c#

我对C#很新。来自纯C / C ++背景。因此,如果我的问题是基本的话,请放轻松。

我正在尝试声明struct Abc的一个对象,它抱怨编译错误如下所示,这意味着,对象obj无法识别。

        string mains1 = obj.s1;
     

错误CS0120:非静态需要对象引用   字段,方法或属性'csharp1.Program.obj'

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

namespace csharp1
{
    class Program
    {
        public struct Abc
        {
            public string s1;
        };

        Abc obj = new Abc();;

        static void Main(string[] args)
        {
            System.Console.WriteLine("start main");
            string cwd = Directory.GetCurrentDirectory();
            string fileName = "Myfile.xml";
            string destFile = System.IO.Path.Combine(cwd, fileName);
            string inpFile = "MyfileINP.xml";
            string inpDir = System.IO.Path.Combine(cwd, "SubDir");
            string srcfile = System.IO.Path.Combine(inpDir,inpFile);
            File.Copy(srcfile, destFile, false);
            string mains1 = obj.s1;
        }
    }
}

不确定这里的错误是什么。

3 个答案:

答案 0 :(得分:8)

这是抱怨,因为你试图从静态上下文中访问Main方法的非静态实例“obj”,所以有多种方法可以解决它,你可以使该实例静态像“static Abc obj = new Abc” )“或者您可以在Main方法中移动该声明,或者您可以创建Program类的实例,然后使用该实例。

  

方法1:

            static  Abc obj = new Abc();

            static void Main(string[] args)
            {
                System.Console.WriteLine("start main");
               //
                string mains1 = obj.s1;
            }
  

方法2:

 static void Main(string[] args)
        {
            Abc obj = new Abc();
            System.Console.WriteLine("start main");
           //
            string mains1 = obj.s1;
        }
  

方法3:

Abc obj = new Abc();

        static void Main(string[] args)
        {
            System.Console.WriteLine("start main");
            //
            string mains1 = new Program().obj.s1;
        }
  

在任何地方制作“静态”始终不是一个好习惯   没有其他选项,使静态允许此对象   在这个类的所有实例中共享,这不是好事   直到我们真的需要它。

答案 1 :(得分:2)

您需要先创建包含类Program的实例,然后才能访问其成员

string mains1 = new Program().obj.s1;

答案 2 :(得分:2)

您正尝试从obj(静态方法)中访问Main(非静态方法)。因此,您将获得CS0120。我建议将Abc obj = new Abc()更改为static ABC obj = new Abc()