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

Почему метод Generic <T> с ограничением "где T: класс" принимает интерфейс

У меня есть interface:

public interface ITestInterface
{
    int TestInt { get; set; }
}

и этот общий метод (с ограничением T : class):

public void Test<T>() where T : class
{
    // DoSomething
}

и этот вызов:

Test<ITestInterface>();

и все компилируется и запускается, пока interface не a class (или это?).

Почему это происходит?

Я впервые увидел это в моем прокси-классе WCF:

public partial class TestServiceClient:
     System.ServiceModel.ClientBase<TestNamespace.ITestService>, TestNamespace.ITestService

где ClientBase<T> имеет это определение:

public abstract class ClientBase<TChannel> : 
     ICommunicationObject, IDisposable where TChannel : class
4b9b3361

Ответ 1

Ограничение class означает, что тип должен быть ссылочным типом, не обязательно классом.

Из спецификации языка С#:

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

В основном это означает, что тип не может быть типом значения.

Типы значений также могут реализовывать интерфейсы, но приведение типа значения к интерфейсу приводит к тому, что значение будет помещено в квадрат

IComparable i = 0;

Теперь i хранит ссылку на коробку 0.