Есть ли способ определить универсальный интерфейс с ограничением, что тип может быть нулевым (но не может быть типом значения)? - PullRequest
1 голос
/ 05 октября 2011

Я бы хотел определить общий интерфейс, который допускает типы значений, допускающие значения NULL (int?, Double? И т. Д.) И типы классов (которые также могут быть нулевыми).Я не хочу разрешать простой тип значения.Есть ли способ сделать это?

Ответы [ 3 ]

6 голосов
/ 05 октября 2011

РЕДАКТИРОВАТЬ: учитывая заголовок вопроса, я предполагаю, что вы хотите ограничить параметр типа не быть типом значения, не допускающим значения NULL.Вероятно, было бы неплохо указать, что в вопросе body тоже.

Нет - такого ограничения нет.Фактически, ограничения class и struct запрещают аргументы, которые могут иметь типы значений, допускающие значение NULL.

Вы можете создать интерфейс без ограничения , но создать только две реализации:

interface IFoo<T> { }

class FooClass<T> : IFoo<T> where T : class {}

class FooNullableValue<T> : IFoo<Nullable<T>> where T : struct {}

Конечно, это не помешает кому-либо еще реализовать IFoo<int>.Если вы сможете дать нам больше информации, мы сможем помочь вам больше.

0 голосов
/ 05 октября 2011

Да, простое использование без ограничений позволяет указать любой тип:

public interface IAllowReferenceTypes<T>
{
   T GetValue();
}

public class SomeClass : IAllowReferenceTypes<Int32?>
{
   public Int32? GetValue() { return null; }
}

РЕДАКТИРОВАТЬ: Исправлено.

Примечание. Вы запрашиваете ограничение в вашемзаголовок, но в теле, если ваш вопрос вы просто задаете для интерфейса, который допускает как типы значений, допускающие обнуляемость, так и ссылочные типы.

Использование без ограничений завершает последнее.Как указывает ответ Джона, нет никакого способа использовать ограничения, гарантирующие, что тип обнуляем.Однако вы не можете использовать никаких ограничений и выполнять проверку на нулевое значение (или по умолчанию (T))

0 голосов
/ 05 октября 2011

Возможно, это .

Ответ Грега Дина:


Измените тип возвращаемого значения на Nullable и вызовите метод с помощьюнеобнуляемый параметр

static void Main(string[] args)
{
    int? i = GetValueOrNull<int>(null, string.Empty);
}


public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
    object columnValue = reader[columnName];

    if (!(columnValue is DBNull))
        return (T)columnValue;

    return null;
}

Также см. следующую статью MSDN об общих интерфейсах: http://msdn.microsoft.com/en-us/library/kwtft8ak.aspx

...