Может ли открытый тип быть структурой? - PullRequest
4 голосов
/ 22 декабря 2010

У меня есть некоторые типы, которые являются структурами по соображениям производительности и имеют некоторую общность. Я хотел бы знать, смогу ли я рефакторинг их, чтобы они были структурами открытого типа, и если бы я мог ожидать каких-либо проблем, если смогу.

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Да, вы можете.Некоторые из универсальных типов, предоставляемых библиотекой инфраструктуры, такие как KeyValuePair<TKey, TValue>, действительно structs.

4 голосов
/ 22 декабря 2010

ОБНОВЛЕНИЕ: Очевидно, под "открытым типом" вы не подразумеваете то же самое, что определение спецификации C # для "открытого типа".Вы имеете в виду «универсальный тип».

Да, структуры могут быть общими.

Чтобы ответить на вторую часть вашего вопроса: я не знаю, какие "проблемы" вы имеете в виду.Можете ли вы привести пример чего-то, что вы считаете проблематичным?


Оригинальный ответ, предполагая, что вы на самом деле спрашивали об открытых типах:

Спецификация C # ясна по этому вопросу:

• Параметр типа определяет открытый тип.

• Тип массива является открытым типом тогда и только тогда, когда его тип элемента является открытым типом.

• Созданный тип является открытым типом тогда и только тогда, когда один или несколько его аргументов типа являются открытым типом.Созданный вложенный тип является открытым типом тогда и только тогда, когда один или несколько его аргументов типа или аргументов типа содержащего его типа (типов) являются открытым типом.

Итак, все.Тип структуры является открытым типом тогда и только тогда, когда он или его окружающий тип является универсальным типом с открытым типом для одного из его аргументов типа.Например:

struct S<T>
{
  S<T> s1; // open struct type
  Nullable<S<T>> s2; // another open struct type
}

class O<V>
{
  class C<U> where U : struct
  {
    struct R
    {
      U u; // open type constrained to be value type
      R r1; // open struct type; this is O<V>.C<U>.R
      O<V>.C<S<U>>.R r2; // another open struct type.
      O<int>.C<S<V>>.R r3; // another open struct type 
    }
  }
}

Мы можем создавать открытые типы структур весь день.

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