Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何将接口转换为扩展接口的接口?_C#_Lambda_Interface_Compiler Errors - Fatal编程技术网

在C#中,如何将接口转换为扩展接口的接口?

在C#中,如何将接口转换为扩展接口的接口?,c#,lambda,interface,compiler-errors,C#,Lambda,Interface,Compiler Errors,我有几个接口: public interface ILockable { public string LockToken { get; set; } } interface ILockableSalesforceRecord : ILockable, ISalesforceRecordable { } public interface IServiceBusMessageReceiver { Ta

我有几个接口:

    public interface ILockable
    {
        public string LockToken { get; set; }
    }

    interface ILockableSalesforceRecord : ILockable, ISalesforceRecordable
    {
    }

    public interface IServiceBusMessageReceiver
    {
        Task DoWithAsync<T>(IQueueConfig queueConfig, Func<List<ILockable>, Task<bool>> function)
            where T : ILockable;
    }
公共接口ILockable
{
公共字符串锁令牌{get;set;}
}
接口ILockableSalesforceRecord:ILockable,IsalForceRecordable
{
}
公共接口IServiceBusMessageReceiver
{
任务DoWithAsync(iqueueEconfig queueConfig,Func函数)
其中T:ILockable;
}
我有一个带有这个签名的方法:

private async Task<bool> WriteToSalesforceCacheAsync<T>(List<ILockableSalesforceRecord> eventBusRecords, CancellationToken cancellationToken)
private async Task writeToSalesforceCacheAync(列出eventBusRecords、CancellationToken CancellationToken)
我想通过以下方法将其传递给最后一个接口的具体化:

        public async Task WriteToSalesforceCacheAsync<T>(IQueueConfig queueConfig, CancellationToken cancellationToken)
            where T : ISalesforceRecordable
        {
            await _serviceBusQueueReceiver.DoWithAsync<T>(queueConfig, async records =>
            {
                return await WriteToSalesforceCacheAsync<T>((List<ILockableSalesforceRecord>)records, cancellationToken)
                    .ConfigureAwait(false);
            });
        }
public async Task writeToSalesforceCacheAync(IQueueConfig queueConfig,CancellationToken CancellationToken)
其中T:IsalForceRecordable
{
wait\u serviceBusQueueReceiver.DoWithAsync(queueConfig,async records=>
{
return wait writeToSalesforceCacheAncync((列表)记录,cancellationToken)
.配置等待(错误);
});
}
但这无法通过以下方式编译:

严重性代码说明项目文件行抑制状态 错误CS0030无法将类型“System.Collections.Generic.List”转换为“System.Collections.Generic.List”Enpal.AzureServiceBustosFCacheTrancriber C:\projects\AzureServiceBustosFCacheTrancriber\AzureServiceBustosFCacheTrancriber\Helpers\RelayHelper.cs 38 Active


我可以/应该做些什么来解决这个问题吗?

在您的界面中,您声明了一个泛型参数
T
,但实际上并没有在参数中使用它

您可能打算这样设计:

public interface IServiceBusMessageReceiver
{
    Task DoWithAsync<T>(IQueueConfig queueConfig, Func<List<T>, Task<bool>> function)
        where T : ILockable;
}
现在,由于
ILockableSalesforceRecord
作为通用参数提供给
DoWithAsync
WriteToSalesforceCacheAync
随后被传递一个
列表,代码编译:



另外,您不应该依赖接口签名中的特定集合类型,例如
列表
,因为这对客户端是有限制的;而是使用依赖于需求的接口类型,例如
IEnumerable
ICollection
等。

查看这篇文章可能会有所帮助:尝试在界面和cast中使用
IList
而不是
List
。但我要说的是,您使用此cast的事实似乎表明您在设计级别上做错了什么。请删除此cast,改用
records.cast().ToList()
,或者
records.OfType().ToList()
如果
records
可能包含未实现的对象
ILockableSalesforceRecord
这看起来像是列表与列表的问题。即使狮子是一种动物,也不能将动物列表投射到狮子列表中。你必须分别铸造每个元素(参见@MindSwipe的评论),这看起来很有希望。我明天试试这个。干杯!:-)
private async Task<bool> WriteToSalesforceCacheAsync(
    List<ILockableSalesforceRecord> eventBusRecords, CancellationToken cancellationToken)
{
    //...
}

public async Task WriteToSalesforceCacheAsync(
    IQueueConfig queueConfig, CancellationToken cancellationToken)
{
    await _serviceBusQueueReceiver.DoWithAsync<ILockableSalesforceRecord>(queueConfig, 
    async records =>
    {
        return await WriteToSalesforceCacheAsync(records, cancellationToken)
            .ConfigureAwait(false);
    });
}