使用IDisposable接口与另一个接口时显示错误消息



在我正在编程的项目中,在一个类同时使用两个接口的部分,我遇到了一个观察错误的问题。

Severity    Code    Description Project File    Line    Suppression State
Error   CS0738  'Valn' does not implement interface member 'IDisposable.Dispose()'. 'Valn.Dispose()' cannot implement 'IDisposable.Dispose()' because it does not have the matching return type of 'void'.  Server  D:ProjectServerLogicValn.cs 17  Active

同样,我创建的类和接口的结构如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel;
using Microsoft.EntityFrameworkCore;
namespace MyWeb.Server.ClassWithInt
{
public interface IValInterface
{
Task<BindingList<Valn>> ValuationSelect();
Task<List<ValnState>> ValuationStatusSelect();
Task Dispose();
}
public class ValnMain : IValInterface, IDisposable
{
private readonly LosacoDbContext MyMaincontext;
public ValnMain(LosacoDbContext dbContext)
{
MyMaincontext = dbContext;
}
public async Task<BindingList<Valn>> ValuationSelect()
{
await MyMaincontext.Valns.LoadAsync();
await MyMaincontext.ValnState.LoadAsync();
return MyMaincontext.Valns.Local.ToBindingList();
}
public async Task<List<ValnState>> ValuationStatusSelect()
{
return await MyMaincontext.ValnState.ToListAsync();
}
public async Task Dispose()
{
await MyMaincontext.DisposeAsync();
}
}
}

我使用了两个方法,在第一个方法中,我用编写了所需的接口:

public class ValnMain : IValInterface, IDisposable

,第二个方法带符号

public class ValnMain : IValInterface : IDisposable

,但再次出现错误。谢谢。如果可能的话,请帮忙。祝你一切顺利。

问题是IDisposable需要一个公共方法void Dispose(),而你的其他接口需要Task Dispose(), c#接口中的方法需要在名称,返回值和参数上遵守接口。因此,虽然您的Dispose inValnMain满足IValInterface接口,但它不满足IDisposable要求。

您可能想使用IAsyncDisposable,或者,如果您想使用OP中的接口,您可以使用显式接口实现IDisposableDispose():

public class ValnMain : IValInterface, IDisposable
{
//[...]
public async Task Dispose()
{
await MyMaincontext.DisposeAsync();
}
void IDisposable.Dispose()
{
// your code here, IDisposable is a synchronous interface
}
}

希望对大家有所帮助

编辑:从声明中删除了public(这将教会我在发布代码之前先检查IDE)

EF Core DbContext实现了IDisposableIAsyncDisposable。所以你必须用正确的返回类型实现两个方法:

public void Dispose() => MyMaincontext.Dispose();
public ValueTask DisposeAsync() => MyMaincontext.DisposeAsync();

但是我会在LosacoDbContext中实现ValuationSelect()和ValuationStatusSelect()。ValnMain只有一个字段(DbContext),所有的操作都应用于它。

最新更新