.NET 8中出现CS0118错误:'BackgroundService'是命名空间却被当作类型使用
解决Error CS0118: 'BackgroundService' is a namespace but is used like a type
问题根源
你的项目命名空间BackgroundService和Microsoft.Extensions.Hosting中的BackgroundService基类完全重名,编译器无法区分你要引用的是类型还是命名空间,这就是触发CS0118错误的核心原因。.NET 6未出现此问题是因为版本间命名解析规则的细微差异,而.NET 8的解析逻辑更严格,导致这个隐藏冲突被暴露。卸载重装NuGet包无效是因为问题不在依赖包本身,而是代码的命名冲突。
解决方案
方案1:修改项目命名空间(推荐)
直接修改命名空间为不重复的名称,从根源避免冲突:
using Microsoft.Extensions.Hosting; namespace MyBackgroundService { public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); } await Task.Delay(1000, stoppingToken); } } } }
方案2:使用完全限定名指定基类
如果不想修改命名空间,通过完整命名空间明确指定要使用的基类:
using Microsoft.Extensions.Hosting; namespace BackgroundService { public class Worker : Microsoft.Extensions.Hosting.BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); } await Task.Delay(1000, stoppingToken); } } } }
方案3:给基类起别名
通过using语句给BackgroundService类设置别名,区分同名的命名空间:
using HostBackgroundService = Microsoft.Extensions.Hosting.BackgroundService; namespace BackgroundService { public class Worker : HostBackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); } await Task.Delay(1000, stoppingToken); } } } }
内容的提问来源于stack exchange,提问作者user10913305
相关产品推荐
相关产品推荐

