2015-05-26 4 views
2

У меня есть два контракта (один общий интерфейс, а другой необщего) следующим образом:Реализация интерфейса Generic и Non общий интерфейс

public interface IGenericContract<T> where T : class 
    { 
     IQueryable<T> GetAll(); 
    } 

public interface INonGenericContract 
    { 
     string GetFullName(Guid guid); 
    } 

У меня есть класс, реализующий оба

public class MyClass<T> : 
     IGenericContract<T> where T : class, INonGenericContract 
    { 
     public IQueryable<T> GetAll() 
     { 
      ... 
     } 

     public string GetFullName(Guid guid) 
     { 
      ... 
     } 
    } 

Все хорошо, пока я не скомпилирую его. Но теперь, когда я пытаюсь использовать этот класс, я сталкиваюсь с этой ошибкой "error CS0311: Тип 'string' не может использоваться как параметр типа 'T' в родовом типе или методе 'ConsoleApplication1.MyClass'. Нет неявной ссылки преобразование из 'string' в 'ConsoleApplication1.INonGenericContract'. "

class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass<string> myClass = new MyClass<string>(); //Error 
     } 
    } 

Если я не выполняю нестандартный договор, он отлично работает. Что здесь может быть не так?

Благодаря

ответ

7

В вашем коде INonGenericContract является частью общего ограничения, так как он размещается после where.

public class MyClass<T> : 
    IGenericContract<T> where T : class, INonGenericContract 

Вы, вероятно, хотите, чтобы:

public class MyClass<T> : 
    IGenericContract<T>, INonGenericContract where T : class 
2

По, что вы показываете

public class MyClass<T> : IGenericContract<T> where T : class, INonGenericContract 

T должны реализовывать INonGenericContract и string не реализует его. Короче говоря, string не является допустимым параметром для класса MyClass

Если то, что вы ищете реализует IGenericContract<T> И INonGenericContract вы должны иметь

public class MyClass<T> : INonGenericContract, IGenericContract<T> 

нет необходимости иметь where T : class так IGenericContract<T> уже что ограничение.

4

вы очень близки, что вы должны сделать, это реализовать нон общий интерфейс, не поставить Ограничить.

public class MyClass<T> : 
    IGenericContract<T>, INonGenericContract where T : class 
{ 
    public IQueryable<T> GetAll() 
    { 
     return null; 
    } 

    public string GetFullName(Guid guid) 
    { 
     return null; 
    } 
} 

теперь вы можете сделать это

MyClass<string> myClass = new MyClass<string>(); 
Смежные вопросы