gpt4 book ai didi

c# - 类型参数约束似乎不适用于返回的类型

转载 作者:太空狗 更新时间:2023-10-29 23:36:13 24 4
gpt4 key购买 nike

我目前正在研究延迟定位自托管 WCF 服务的实现。这些服务在必须从 IWCFServiceBase 继承的客户端和主机的公共(public)接口(interface)中定义它们的契约(Contract)。 .

WCFHost之后托管由 IWCFServiceBase 约束的类型参数指定的接口(interface): public class WCFHost<T> where T : WCFServiceBase, IWCFServiceBase客户端可以通过指定接口(interface)和服务标识符来订阅此主机:public class WCFClient<T> : IDisposable where T : IWCFServiceBase .到目前为止,此功能可以完美运行。

现在我想尝试对“Lazy-Discover”服务进行排序,并为每个发现的服务保持可用 channel 打开。此功能由一个定位器提供,该定位器将所有已发现的服务保存在以下结构中:public Dictionary<string, Dictionary<IWCFServiceBase, WCFClient<IWCFServiceBase>>> Services;

现在假设之前使用过一个服务,所以它已经被发现并保存在字典中,我使用以下代码来检索它:

 public WCFClient<T> GetMicroService<T>(string servicename, T contract) where T : IWCFServiceBase
{
if (this.Services.ContainsKey(servicename) && this.Services[servicename].ContainsKey(contract))
{
return this.Services[servicename][contract];
}
}

类型Client.WCFClient<WCFCommunication.IWCFServiceBase>不能隐式转换为 Client.WCFClient<T> .

显然是这样的T != IWCFServiceBase除非你采用类型约束 where T : IWCFServiceBase考虑在内。

那么,为什么 C# 不这样做,我做错了什么?我觉得我尝试使用泛型的方式一定有很大的错误。

最佳答案

内部字典只“知道”它有一个 WCFCLient<IWCFServiceBase>作为值(value)。你放任何都没有用 WCFCLient<IWCFServiceBase>在那里。您可能已确保只将正确的值放在那里,但编译器无法分辨。你只需要添加一个类型转换来表明你确定。

我会使用 TryGetValue这里不是 ContainsKey ,还有。假设您可以使用 C# 7:

public WCFClient<T> GetMicroService<T>(string serviceName, T contract)
where T : IWCFServiceBase
{
if (Services.TryGetValue(serviceName, out var service) &&
service.TryGetValue(contract, out var client))
{
// client will just be WCFClient<IWCFServiceBase>, so we need to cast
return (WCFClient<T>) client;
}
// Throw an exception or whatever...
}

或者为 out 使用单独的变量声明参数:

public WCFClient<T> GetMicroService<T>(string serviceName, T contract)
where T : IWCFServiceBase
{
Dictionary<IWCFServiceBase, WCFClient<IWCFServiceBase>> service;
WCFClient<IWCFServiceBase> client;
if (Services.TryGetValue(serviceName, out service) &&
service.TryGetValue(contract, out client))
{
// client will just be WCFClient<IWCFServiceBase>, so we need to cast
return (WCFClient<T>) (object) client;
}
// Throw an exception or whatever...
}

关于c# - 类型参数约束似乎不适用于返回的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50057671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com