Принудительное использование (универсального) типа значения в качестве ссылки - PullRequest
8 голосов
/ 31 августа 2010

У меня есть структура с некоторыми полями. Одно из полей имеет универсальный тип. Универсальный тип может быть либо ссылочным типом, либо типом значения .

Я хочу заставить его храниться как ссылка внутри, чтобы избежать слишком большой структуры.

struct Foo<T>
{
  T field; // should be a reference
}

Я знаю, что могу использовать object или T[], но оба неудобны. Есть ли что-то похожее на общий тип ссылки?

struct Foo<T>
{
  Reference<T> field;
}

Да, конечно, я мог бы написать свой собственный. Но я пытаюсь избежать этого

Ответы [ 4 ]

10 голосов
/ 31 августа 2010

Определите T как класс.

struct Foo<T> where T : class
{
  T field; // Now it's a reference type.
}
3 голосов
/ 31 августа 2010

Вы можете использовать Tuple<T1> для хранения переменной типа значения (Tuples - это классы в BCL)

struct Foo<T>
{
    Tuple<T> field;
}
2 голосов
/ 06 июня 2011

Если вы хотите быть абсолютно уверенным в том, что какой-либо тип значения упакован, сохраните его в поле объекта и используйте свойство для применения общего ограничения; то есть:

struct Example<T>
{
    private object obj;
    public T Obj
    {
        get
        {
            return (T)obj;
        }
        set
        {
            this.obj = value;
        }
    }
}
0 голосов
/ 31 августа 2010

и если вы хотите, чтобы это был экземпляр:

where T : new()
...