2015-12-14 2 views
0

У меня есть этот метод:Общий метод Constraint ошибка - Рассмотреть использование явной реализации интерфейса вместо

public T GetRepositoryByType<T>() where T : IContextDependent 
{ 
    var instance = this.Repositories.SingleOrDefault(x => x is T); 

    return (T)instance; 
} 

Что нужно, чтобы иметь возможность вернуть любой экземпляр хранилища, который реализует IContextDependent, так что я могу установить DbContext для каждого вручную.

Когда я строю я получаю эту ошибку:

Error CS0425 The constraints for type parameter 'T' of method 'RepositoryProvider.GetRepositoryByType()' must match the constraints for type parameter 'T' of interface method 'IRepositoryProvider.GetRepositoryByType()'. Consider using an explicit interface implementation instead.

Однако, если рассмотреть этот код из MSDN:

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T> 
{ 
    T temp; 
    if (lhs.CompareTo(rhs) > 0) 
    { 
     temp = lhs; 
     lhs = rhs; 
     rhs = temp; 
    } 
} 

Я не вижу никакой непосредственной разницы (если зависимость дальнейшие дженериков не надо?).

FYI, интерфейс довольно прост:

public interface IContextDependent 
{ 
    void SetContext(MyEntities context); 
} 

И интерфейс IRepositoryProvider:

public interface IRepositoryProvider 
{ 
    T GetRepositoryByType<T>(); 
} 

Что вызывает ошибку?

+0

Я добавил terface. Должен ли мой «IRepositoryProvider» наследовать от «IContextDependent», чем ?. – Spikee

ответ

1

RepositoryProvider.GetRepositoryByType()' must match the constraints for type parameter 'T' of interface method 'IRepositoryProvider.GetRepositoryByType()'

Ваше ограничение на RepositoryProvider является: where T : IContextDependent
И поэтому ваше ограничение на IRepositoryProvider сусло также быть where T : IContextDependent

То есть, ваш интерфейс должен быть записан следующим образом:

public interface IRepositoryProvider 
{ 
    T GetRepositoryByType<T>() where T : IContextDependent; 
} 
+1

Так просто, спасибо! – Spikee

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