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

Blazor WebAssembly编译报错:成员名称不能与其封闭类型同名

解决Blazor WebAssembly中“Member name cannot be the same as their enclosing type”错误

这个问题其实是C#基础语法规则在Blazor组件中的直接体现,我在社区里见很多刚接触Blazor的开发者踩过这个坑。下面给你拆解原因和解决办法:

核心原因

每个.razor页面最终会被编译成一个同名的C#部分类,比如你创建了Todo.razor,编译器会生成一个public partial class Todo : ComponentBase的类。而C#有一个硬性规则:类的成员(字段、属性、方法等)的名称不能和类本身的名称完全一致——不管是大小写还是拼写,只要完全匹配就会触发这个报错。

常见触发场景

  • 新手习惯用组件名直接作为状态变量名:比如Counter.razor里定义private int Counter = 0,刚好和组件类名撞了
  • 组件重命名后,内部的成员名称没同步修改:比如把TodoList.razor改成TaskList.razor,但里面还留着private List<Todo> TodoList { get; set; }
  • 复制粘贴其他组件代码时,没注意修改变量名,刚好和当前组件名重复

错误示例与修复

举个典型的错误代码:

@page "/counter"

<h1>Counter</h1>
<p>当前计数:@Counter</p>

<button @onclick="Increment">点击增加</button>

@code {
    // 这里的字段名Counter和组件类名Counter完全一致,触发报错
    private int Counter = 0;

    private void Increment()
    {
        Counter++;
    }
}

修复只需要把重名的成员改名就行,遵循C#的命名惯例,私有字段可以加下划线或者用小驼峰:

@page "/counter"

<h1>Counter</h1>
<p>当前计数:@_currentCount</p>

<button @onclick="Increment">点击增加</button>

@code {
    // 改成不重复的名称
    private int _currentCount = 0;

    private void Increment()
    {
        _currentCount++;
    }
}

额外提示

Blazor组件的类名是由文件名决定的,所以排查的时候先确认你的.razor文件名是什么,然后在@code块里检查所有成员的名称,确保没有和文件名完全匹配的(C#大小写敏感,但通常组件名是大驼峰,成员如果也是大驼峰就很容易撞)。

内容的提问来源于stack exchange,提问作者Ole EH Dufour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:07:32