2013-02-11 2 views
3

Я пишу свободную регистрацию для поставщика кеша, но почему-то мои дженерики недовольны. Я получаю ошибку на бит: value = _loadFunction();Невозможно неявно преобразовать тип 'T' в 'T

Cannot implicitly convert type 'T' to 'T [HttpRuntimeCache.cs(10)] 

код ниже:

using IDM.CMS3.Service.Cache; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Caching; 

namespace IDM.CMS3.Web.Public.CacheProviders 
{ 
    public class HttpRuntimeCache<T> : IFluentCacheProvider<T> 
    { 
     string _key; 
     Func<T> _loadFunction; 
     DateTime? _absoluteExpiry; 
     TimeSpan? _relativeExpiry; 

     public HttpRuntimeCache() 
     { 

     } 

     public IFluentCacheProvider<T> Key(string key) 
     { 
      _key = key; 
      return this; 
     } 

     public IFluentCacheProvider<T> Load(Func<T> loadFunction) 
     { 
      _loadFunction = loadFunction; 
      return this; 
     } 

     public IFluentCacheProvider<T> AbsoluteExpiry(DateTime absoluteExpiry) 
     { 
      _absoluteExpiry = absoluteExpiry; 
      return this; 
     } 

     public IFluentCacheProvider<T> RelativeExpiry(TimeSpan relativeExpiry) 
     { 
      _relativeExpiry = relativeExpiry; 
      return this; 
     } 

     public T Value() 
     { 
      return FetchAndCache<T>(); 
     } 

     public void InvalidateCacheItem(string cacheKey) 
     { 
      throw new NotImplementedException(); 
     } 

     T FetchAndCache<T>() 
     { 
      T value; 
      if (!TryGetValue<T>(_key, out value)) 
      { 
       value = _loadFunction(); 
       if (!_absoluteExpiry.HasValue) 
        _absoluteExpiry = Cache.NoAbsoluteExpiration; 

       if (!_relativeExpiry.HasValue) 
        _relativeExpiry = Cache.NoSlidingExpiration; 

       HttpContext.Current.Cache.Insert(_key, value, null, _absoluteExpiry.Value, _relativeExpiry.Value); 

      } 
      return value; 
     } 

     bool TryGetValue<T>(string key, out T value) 
     { 
      object cachedValue = HttpContext.Current.Cache.Get(key); 
      if (cachedValue == null) 
      { 
       value = default(T); 
       return false; 
      } 
      else 
      { 
       try 
       { 
        value = (T)cachedValue; 
        return true; 
       } 
       catch 
       { 
        value = default(T); 
        return false; 
       } 
      } 
     } 
    } 
} 
+0

Имеет ли общий аргумент 'IFluentCacheProvider' какие-либо ограничения? – carlosfigueira

+0

Я полагаю, что могу наложить ограничение класса на него. Они просто будут объектами из базы данных. –

+1

Вы затеняете параметр типа из объявления класса 'HttpRuntimeCache ' с одним и тем же именем в 'FetchAndCache '. Это разные 'T'. Кажется, вам не нужно дублировать параметры типа в методах. – millimoose

ответ

5

T FetchAndCache<T> и bool TryGetValue<T> являются переопределениеновыйT типа отдельно от одного объявленного в классе уровень. Я думаю, что после удаления дополнительной общей декларации она должна работать нормально. То есть, переписать их быть:

T FetchAndCache() 
{ 
    ... 
} 

bool TryGetValue(string key, out T value) 
{ 
    ... 
} 

После того, как вы сделаете это, то компилятор распознает T здесь в качестве одного объявленного в классе.

Смежные вопросы