You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#类中声明匿名类型成员用var报CS0825错误该如何解决

C# 类成员实现类似匿名类型效果的解决方案

根本原因

C# 的匿名类型是编译器生成的内部类型,没有可在代码中显式引用的公开名称,且var关键字仅支持局部变量的类型推导,因此无法直接将匿名类型声明为类的字段或属性。

推荐解决方案

方案1:C# 9+ 使用Record类型(最优)

Record类型是C# 9引入的不可变值类型,语法简洁,序列化JSON的行为和匿名类型完全一致,完美匹配你需要灵活类型、方便导出JSON的需求:

public class Logger
{
    // 定义嵌套的Record类型,支持任意类型的属性(int、string等均可)
    public record RecordIdDef(int Foo, string Bar);
    
    // 静态属性可直接通过类名访问,和你预期的用法完全一致
    public static RecordIdDef RecordId { get; } = new(0, "can be also a string");
}

// 访问方式
var foo = Logger.RecordId.Foo;
var bar = Logger.RecordId.Bar;

方案2:低版本C# 使用POCO类

如果使用的C#版本低于9,没有Record语法,可以自定义普通的只读类实现相同效果:

public class Logger
{
    public class RecordIdDef
    {
        // 只读属性保证和匿名类型一样的不可变特性
        public int Foo { get; }
        public string Bar { get; }

        public RecordIdDef(int foo, string bar)
        {
            Foo = foo;
            Bar = bar;
        }
    }

    public static RecordIdDef RecordId { get; } = new RecordIdDef(0, "can be also a string");
}

方案3:使用dynamic(不推荐)

如果不想额外定义类型,也可以用dynamic声明成员,但是会丢失编译时类型检查,写错属性名不会在编译阶段报错,运行时才会触发异常,仅适合临时快速实现的场景:

public class Logger
{
    public static dynamic RecordId { get; } = new { Foo = 0, Bar = "can be also a string" };
}

以上三种方案都支持任意类型的属性,完全可以替代枚举实现多类型取值、导出JSON的需求。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:24:00