C # Обобщения и ограничения - PullRequest
2 голосов
/ 17 февраля 2011

Если у меня есть общее ограничение, где C должен быть структурой:

class MyNum<C> where C : struct
{
    C a;
    public MyNum(C a)
    {
        this.a = a;
    }
}

struct myStruct
{
    public int a;
}

Я понимаю, что это компилируется:

    myStruct n = new myStruct();
    n.a = 5;
    MyNum<myStruct> str = new MyNum<myStruct>(n);

Но зачем это компилировать.Number Является ли число 5 структурой?

Я подумал, сделав так:

int b = 5;

b будет иметь тип int, а не тип struct.Я предполагаю, что я что-то здесь упускаю.

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

int b = 5; 

Я являюсь экземпляром b?Создание экземпляра int?По некоторым причинам, когда я думаю о «экземплярах», я думаю о ссылочных типах.

Здесь:

Car c1 = new Car(); 

Здесь я понимаю, что я создаю экземпляр Car или создаю экземпляр c1.

Ответы [ 3 ]

12 голосов
/ 17 февраля 2011

int - это struct.

Посмотрите на Int32 определение на MSDN


EDIT:

Выполнение:

 int i = 5;

а также:

MyStruct m = new MyStruct();

вы создаете область памяти размером с необходимое пространство для размещения структуры.
Разница со ссылочными типами заключается в том, что переменные m и i не являются ссылками на те области памяти, в которых хранятся значения, но в основном они "само значение" .

Infact, когда вы делаете:

MyStruct m1 = new MyStruct();
MyStruct m2 = m1;

m2 не представляет ту же ячейку памяти m1, но содержимое m1 копируется в новую ячейку памяти, представленную переменной m2

7 голосов
/ 17 февраля 2011

Согласно MSDN с ограничением типа структуры, аргумент типа должен быть типом значения. Можно указать любой тип значения, кроме Nullable.

И как diggEmAll уже упоминалось, что int это struct

2 голосов
/ 17 февраля 2011

Да, 5 - это int, а int - это структура

...