我有一个重载方法-第一个实现总是返回一个对象,第二个实现总是返回一个枚举。

我想使方法成为泛型和重载,并在泛型为可枚举类型时限制编译器尝试绑定(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/

10-13 23:40