Подтвердить что ты не робот

С# Generics: ограничение T, где T: объект не компилируется; Ошибка: ограничение не может быть специальным классом 'object'

Когда я сдерживаю T с: Object следующим образом:

public interface IDoWork<T> where T : Object
{
    T DoWork();
}

Я получаю сообщение об ошибке:

Ограничение не может быть специальным классом 'object'

Означает ли это, что существует явная разница в следующем: компилируется?

public interface IDoWork<T> // where T : Object
{
    T DoWork();
}
4b9b3361

Ответ 1

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

Спецификация языка С# 4.0 (10.1.5 Ограничения параметра типа) говорит об этом две вещи:

Тип не должен быть объектом. Поскольку все типы происходят от объекта, такое ограничение не будет иметь никакого эффекта, если бы оно было разрешено.

...

Если T не имеет первичных ограничений или ограничений параметров типа, его эффективным базовым классом является объект.

В своем комментарии вы сказали, что пытаетесь сделать T типом Void. Void - это специальный тип, который указывает, что тип возврата отсутствует и не может использоваться вместо T, для которого требуется конкретный конкретный тип. Вам нужно будет создать версию void вашего метода и версию T, если вы хотите оба.

Ответ 2

Если вы хотите ограничить тип общего типа ссылочным типом, используйте : class.

public interface IDoWork<T> where T : class
{
    T DoWork();
}

Это запретит универсальному типу быть типом значения, например int или struct.

Ответ 3

В соответствии со спецификацией языка С# 4.0 (Coded: [10.1.5] Ограничения параметра типа) указывает две вещи:

1] Тип не должен быть объектом. Поскольку все типы происходят от объекта, такое ограничение не будет иметь никакого эффекта, если бы оно было разрешено.

2] Если T не имеет первичных ограничений или ограничений параметров типа, его эффективный базовый класс - это объект.

Когда вы определяете общий класс, вы можете применять ограничения на типы типов, которые код клиента может использовать для аргументов типа, когда он создает экземпляр вашего класса. Если код клиента пытается создать экземпляр вашего класса, используя тип, который не допускается ограничением, результатом является ошибка времени компиляции. Эти ограничения называются ограничениями. Ограничения задаются с использованием контекстного ключевого слова where. Если вы хотите ограничить тип общего типа ссылочным типом, используйте: class.

Согласно MSDN

Ограничение не может быть специальным идентификатором класса. Следующие типы не могут использоваться в качестве ограничений:

  • System.Object
  • System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType.