Реализация обнуляемых типов в универсальном интерфейсе - PullRequest
9 голосов
/ 28 августа 2009

Итак, в предыдущем вопросе я спросил о реализации универсального интерфейса с открытым классом и бинго, все работает. Однако один из типов, которые я собираюсь передать, - это один из встроенных типов, допускающих обнуление, таких как: int, Guid, String и т. Д.

Вот мой интерфейс:

public interface IOurTemplate<T, U>
    where T : class
    where U : class
{
    IEnumerable<T> List();
    T Get(U id);
}

Итак, когда я реализую это так:

public class TestInterface : IOurTemplate<MyCustomClass, Int32>
{
    public IEnumerable<MyCustomClass> List()
    {
        throw new NotImplementedException();
    }

    public MyCustomClass Get(Int32 testID)
    {
        throw new NotImplementedException();
    }
}

Я получаю сообщение об ошибке: Тип 'int' должен быть ссылочным типом, чтобы использовать его в качестве параметра 'U' в универсальном типе или методе 'TestApp.IOurTemplate'

Я пытался вывести тип Int32 ?, но та же ошибка. Есть идеи?

Ответы [ 3 ]

7 голосов
/ 28 августа 2009

Я бы не стал этого делать, но, возможно, это единственный способ заставить его работать.

public class MyWrapperClass<T> where T : struct 
{
    public Nullable<T> Item { get; set; }   
}

public class MyClass<T> where T : class 
{

}
6 голосов
/ 28 августа 2009

Обнуляемые типы не удовлетворяют ограничениям class или struct:

Спецификация языка C # v3.0 (раздел §10.1.5: Ограничения параметров типа):

Ограничение ссылочного типа указывает, что аргумент типа, используемый для параметра типа, должен быть ссылочным типом. Все типы классов, типы интерфейсов, типы делегатов, типы массивов и параметры типов, известные как ссылочный тип (как определено ниже), удовлетворяют этому ограничению. Ограничение типа значения указывает, что аргумент типа, используемый для параметра типа, должен иметь тип значения, не допускающий значения NULL.

Все ненулевые типы структур, перечислимые типы и параметры типов, имеющие ограничение типа значения, удовлетворяют этому ограничению. Обратите внимание, что, хотя классифицируется как тип значения, обнуляемый тип (§4.1.10) не удовлетворяет ограничению типа значения. Параметр типа, имеющий ограничение типа значения, также не может иметь ограничение конструктора.

1 голос
/ 28 августа 2009

Любая причина, почему вам нужно ограничить тип U для класса?

public interface IOurTemplate<T, U>
    where T : class
{
    IEnumerable<T> List();
    T Get(U id);
}

public class TestInterface : IOurTemplate<MyCustomClass, Int32?>
{
    public IEnumerable<MyCustomClass> List()
    {
        throw new NotImplementedException();
    }

    public MyCustomClass Get(Int32? testID)
    {
        throw new NotImplementedException();
    }
}

К вашему сведению: int? является сокращением C # для Nullable<int>.

...