我对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;
}
}
}
不确定这里的错误是什么。
答案 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()
。