Если есть подпрограмма, которая принимает параметр типа IEnumerator<string>
, есть ли способ отличить ссылку на экземпляр типа класса от ссылки на экземпляр типа значения в штучной упаковке? Я знаю, что если у вас есть рутина, как:
void DoSomething<T>(T param) where T:IEnumerator
Можно определить, является ли T
типом значения или ссылочным типом, без использования отражения, просто выполнив Object.ReferenceEquals(param, param)
. Это всегда будет возвращать true, если T
является типом класса, и всегда возвращать false, если это тип значения (это не может быть типом значения, допускающим значение NULL, поскольку он реализует интерфейс). С другой стороны, если бы кто-то позвонил DoSomething<IEnumerator<string>>(myListOfStrings.GetEnumerator())
, я не знаю, каким образом DoSomething
смог бы без использования Reflection отличить поведение в штучной упаковке IEnumerator<string>
от поведения любого другого типа класса. Есть ли какой-либо не связанный с Reflection способ, которым поведение типов значений в штучной упаковке отличается от поведения типов классов?
Добавление
Чтобы прояснить вопрос, предположим, что у меня есть структура S1
, которая реализует IFoo
, и у меня есть класс C1
, который реализует тот же интерфейс и имеет точно такие же методы и поля. Если есть переменная объявленного типа IFoo
, есть ли способ, которым «естественное» поведение экземпляра S1
в штучной упаковке, на которое ссылается эта переменная, будет отличаться от поведения C1
, на который ссылаются, аналогично , кроме тот факт, что GetType (), конечно, будет возвращать различные Type
объекты ?