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

.NET Core中能否在重载结构体运算符中使用常量参数?编译报错求助

解决.NET Core 2.0中不可变结构体运算符重载编译失败问题

这个错误CS0019通常意味着编译器找不到你定义的+运算符重载,结合你用的是**不可变结构体(readonly struct)**和.NET Core 2.0环境,我帮你梳理几个最可能的原因和解决步骤:

1. 检查运算符重载的访问修饰符与定义位置

首先确保你的+运算符是在结构体内部以public static的权限定义的——如果是私有的或者放在结构体外部,控制台项目根本看不到这个重载。比如正确的定义应该是这样:

// 类库中的readonly struct
namespace MyImmutableStructLib
{
    public readonly struct S
    {
        public int Value { get; }

        public S(int value) => Value = value;

        // 必须是public static,返回新的S实例
        public static S operator +(S left, S right)
        {
            return new S(left.Value + right.Value);
        }
    }
}

2. 确认readonly struct的运算符重载符合规则

不可变结构体的所有成员都是只读的,所以你的+运算符必须返回一个新的结构体实例,而不能修改原实例的属性(这本来也做不到)。如果你的重载逻辑里尝试修改输入的结构体成员,不仅会编译失败,也违背了不可变类型的设计原则。

3. 验证C# 7.2版本是否真正生效

虽然你说已经配置了C# 7.2,但有时候项目的配置可能没正确应用:

  • 右键类库和控制台项目 → 属性 → 生成 → 点击高级按钮,确认语言版本确实选择了C# 7.2(而不是默认的"最新次要版本"或者更低版本)。
  • 如果你用的是.csproj手动编辑,确保两个项目都有:
    <PropertyGroup>
      <LangVersion>7.2</LangVersion>
    </PropertyGroup>
    

4. 排查引用与命名空间问题

  • 确认控制台项目引用的是正确的类库项目(不是旧版本的DLL或者其他同名项目)。
  • 在控制台项目中,确保你已经引用了结构体所在的命名空间:using MyImmutableStructLib;,否则编译器可能找不到类型S,或者误判为其他同名类型。

如果按照上面的步骤检查后,你的代码应该能正常编译运行。比如控制台项目中的使用代码:

using MyImmutableStructLib;

class Program
{
    static void Main(string[] args)
    {
        var s1 = new S(5);
        var s2 = new S(10);
        var s3 = s1 + s2; // 现在应该可以正常编译
        Console.WriteLine(s3.Value); // 输出15
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:14:25