Ограничение класса значения C ++ / CLI не будет компилироваться. Зачем? - PullRequest
6 голосов
/ 16 мая 2010

Несколько недель назад мой коллега потратил около двух часов, чтобы выяснить, почему этот фрагмент кода C ++ / CLI не будет компилироваться с Visual Studio 2008 (я только что протестировал его с Visual Studio 2010 ... та же история) .

public ref class Test
{
    generic<class T> where T : value class
        void MyMethod(Nullable<T> nullable)
    {

    }
};

Компилятор говорит: Ошибка

1 ошибка C3214: «T»: неверный тип аргумент для общего параметра 'T' из универсальный 'System :: Nullable', не встретить ограничение 'System :: ValueType ^ 'C: \ Users \ Simon \ Desktop \ Projektdokumentation \ GridLayoutPanel \ Generics \ Generics.cpp 11 1 Generics

Добавление ValueType сделает код скомпилированным.

public ref class Test
{
    generic<class T> where T : value class, ValueType
        void MyMethod(Nullable<T> nullable)
    {

    }
};

Мой вопрос сейчас. Зачем? В чем разница между value class и ValueType?

P.S .: См. Определение Nullable для C ++: http://msdn.microsoft.com/de-de/library/b3h38hb0.aspx

Ответы [ 2 ]

5 голосов
/ 16 мая 2010

Я проанализировал код IL трех следующих методов:

generic<class T> where T : value class, System::ValueType
    static void MyMethod(T arg)
{

}

generic<typename T> where T: value class
    static void MyMethod2(T arg)
{

}

generic<typename T> where T: ValueType 
    static void MyMethod3(T arg)
{
}

Соответствующий IL-код, который я разбирал с помощью .NET-Reflector:

.method public hidebysig 
 static void MyMethod<valuetype ([mscorlib]System.ValueType).ctor T>
(!!T arg) cil managed
{
}


.method public hidebysig 
static void MyMethod2<valuetype .ctor T>(!!T arg) cil managed
{
}


.method public hidebysig
static void MyMethod3<([mscorlib]System.ValueType) T>(!!T arg) cil managed
{
}

Это IL-декларация Nullable<T>:

.class public sequential ansi serializable sealed beforefieldinit 
Nullable<valuetype (System.ValueType) .ctor T>
    extends System.ValueType

Как вы можете ясно видеть, только ограничение первого метода соответствует 100% с Nullable<T>. (Кстати: value class, кажется, подразумевает наличие стандартного конструктора). Однако, почему компилятор создает разные IL-коды для (семантически) одинаковых ограничений, остается загадкой. Я буду просить гуру Microsoft C ++ / CLI для получения дополнительной информации.

0 голосов
/ 16 мая 2010

ValueType отличается тем, что это «базовый класс» типов значений, но не сам тип значений. Это, вероятно, проблема здесь.

Прекрасный список различных сущностей, используемых CLR, можно найти в этом отличном сообщении в блоге .

См. Также this и this thread для получения дополнительной информации, относящейся к ValueType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...