Почему метод 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
Ответы
Ответ 1
Ограничение class
означает, что тип должен быть ссылочным типом, не обязательно классом.
Из спецификации языка С#:
Ограничение ссылочного типа указывает, что аргумент типа, используемый для параметра типа, должен быть ссылочным типом. Все типы классов, типы интерфейсов, типы делегатов, типы массивов и параметры типа, известные как ссылочный тип (как определено ниже), удовлетворяют этому ограничению.
В основном это означает, что тип не может быть типом значения.
Типы значений также могут реализовывать интерфейсы, но приведение типа значения к интерфейсу приводит к тому, что значение будет помещено в квадрат
IComparable i = 0;
Теперь i
хранит ссылку на коробку 0
.