我有一个重载方法-第一个实现总是返回一个对象,第二个实现总是返回一个枚举。
我想使方法成为泛型和重载,并在泛型为可枚举类型时限制编译器尝试绑定(bind)到非枚举方法...
class Cache
{
T GetOrAdd<T> (string cachekey, Func<T> fnGetItem)
where T : {is not IEnumerable}
{
}
T[] GetOrAdd<T> (string cachekey, Func<IEnumerable<T>> fnGetItem)
{
}
}
用于...
{
// The compile should choose the 1st overload
var customer = Cache.GetOrAdd("FirstCustomer", () => context.Customers.First());
// The compile should choose the 2nd overload
var customers = Cache.GetOrAdd("AllCustomers", () => context.Customers.ToArray());
}
是我在这里侵犯的只是普通的不好的代码气味,还是可以消除上述方法的歧义,以便编译器始终能够正确获取调用代码?
为除“重命名方法之一”以外的其他答案都可以的人投票。
最佳答案
仅使用一种方法,让它动态检测IEnumerable<T>
大小写,而不是通过通用约束尝试不可能的情况。根据存储/检索对象是否可枚举,必须处理两种不同的缓存方法将是“代码异味”。同样,仅因为它实现了IEnumerable<T>
并不意味着它必然是一个集合。
关于c# - 我使用通用限制阻止特定类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3891157/