You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#结构体对象声明报错求助:CS0120错误(C/C++背景新手)

嘿,别担心基础问题,谁都是从新手阶段摸爬滚打过来的,完全不用不好意思😉

咱们先来拆解你遇到的CS0120错误,这个错误核心原因是:你试图访问一个「非静态的字段/方法/属性」,但没有提供对应的对象引用,结合你的描述,大概率是下面两种情况之一:

情况1:你没正确创建结构体Abc的实例

C#里结构体是值类型,虽然用法和C++的结构体有相似之处,但如果你只是在类里声明了obj作为非静态字段,却在静态的Main方法里直接用,就会出问题——因为静态方法属于类本身,不能直接访问类的非静态成员(非静态成员属于类的具体实例)。

或者更简单:你可能根本没在当前作用域里创建Abc的实例!比如漏写了Abc obj = new Abc();这行代码。

情况2:结构体成员的访问权限没设置对

C#里结构体的成员默认是private的,如果没加public修饰符,你在结构体外部根本访问不到s1这个成员,不过这个会报另一个错误,但也可能和你的问题叠加出现。

给你贴个能正常运行的示例代码,对比一下就清楚了

using System;

namespace csharp1
{
    // 定义结构体,成员要加public才能外部访问
    struct Abc
    {
        public string s1;
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 1. 在Main方法内部创建Abc的实例obj
            Abc obj = new Abc();
            // 2. 给成员赋值
            obj.s1 = "我是结构体里的字符串";
            // 3. 正常访问成员
            string mains1 = obj.s1;
            
            Console.WriteLine(mains1); // 输出内容
        }
    }
}

如果你是把obj作为类的字段使用(类似你代码里的csharp1.Program.obj),那得这么改

比如你原来的代码可能是把obj声明成了Program类的非静态字段,那在静态的Main方法里访问时,要么把obj改成静态,要么创建Program的实例:

方法1:把obj设为静态字段

class Program
{
    // 把obj改成静态字段,属于类本身
    static Abc obj;

    static void Main(string[] args)
    {
        obj = new Abc();
        obj.s1 = "静态字段版测试";
        string mains1 = obj.s1;
    }
}

方法2:创建Program类的实例再访问

static void Main(string[] args)
{
    // 创建Program的实例p
    Program p = new Program();
    // 给p的obj字段赋值
    p.obj = new Abc();
    p.obj.s1 = "实例访问版测试";
    string mains1 = p.obj.s1;
}

最后补个和C++的小差异提醒

C++里结构体成员默认是public的,但C#里刚好相反,默认是private,所以一定要记得给结构体里需要外部访问的成员加public修饰符,不然会出现访问权限错误。

内容的提问来源于stack exchange,提问作者codeLover

火山引擎 最新活动