Нужна помощь в понимании дженериков C #

2

Я самостоятельно изучаю ссылку на С# и дает следующую информацию:

части 1.21.4. Объявление общих параметров Общие параметры могут быть введены в объявление классов, структур, интерфейсов, делегатов (см. Раздел "Делегаты" ) и методы. Другие конструкции, такие как свойства, не могут вводить общий параметр, но могут использовать общий параметр. Например, свойство Value использует T:

public struct Nullable<T>
{
  public T Value {get;}
}

Во-первых, я получаю сообщение об ошибке, пытающееся скомпилировать это высказывание, что оно должно содержать тело, потому что оно не является ни абстрактным, ни extern, или что автоматические параметры должны иметь как get, так и set accessors.

Во-вторых, если предположить, что это неправильно, и я исправлю его, добавив "set;", я не могу отформатировать его успешно.

Теги:
visual-studio

5 ответов

2
Лучший ответ

Я не уверен, что вы просто выбрали плохой пример для своего имени структуры (поскольку Nullable - это структура структуры), но если нет, ошибка связана с тем, что у вас нет установленного доступа к вашему свойству. Автоматическим свойствам (добавленным в С# 3.0) необходимо как свойство get, так и set. Итак, если вы измените код на:

public struct Nullable<T>
{
  public T Value {get; set; }
}

он должен работать. В этом случае ошибка не имела ничего общего с дженериками. Чтобы создать экземпляр, вы можете использовать:

Nullable<int> i = new Nullable<int>();

Это сделает компиляцию. Однако, как указал Джон и Церебрус, это, вероятно, просто пример, показывающий работу дженериков.

  • 0
    Пример был скопирован из книги напрямую. Я отметил, что «множество»; скучал. Однако они не показали звонок. Я пропускал <int> в левой части уравнения в моих различных попытках доступа к методу. Этот ответ решил это правильно. Спасибо!
8

Это просто показывает API Nullable<T>, а не реализацию. Он не предназначен для компиляции - System.Nullable<T> является частью структуры, вам не нужно ее реализовывать самостоятельно.

3

Кажется, вы читаете "С# 3.0 в двух словах". Ну, вот пример - пример. Он предназначен только для иллюстрации того, как свойство Value класса Generic Nullable предоставляет общий параметр, объявленный содержащим типом.

Он не должен быть частью компилируемого примера.

1

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

//tradition 
private T _value; 
public T Value 
{ 
    get 
    {
        return _value;
    }
}
//locally, _value can always be set

//Auto-matically implemented property
public T Value { get; }
//there is never a way to set it

//with this it can be privately set, but is get only to everyone else
public T Value{ get; private set; }
0

Ваш вопрос здесь, кажется, об авто-свойствах, а не о дженериках.

Авто-свойства должны иметь набор доступа, хотя он не должен иметь ту же видимость, что и get:

public T Value { get; private set; }

Вы можете вызвать набор в конструкторе:

public Nullable ( T value ) {
    Value = value;
}

Хотя в этом случае вы имеете дело со структурой, и у них всегда есть конструктор по умолчанию (без параметров) - вы должны быть немного более осторожны с structs и auto-properties.

В .net уже существует нулевое общее число:

Nullable<int> i = GetCounterThatMightBeNull();

int j = 0;
if( i.HasValue )
    j = i.Value;
...

Это было добавлено в .Net 2 (одновременно с дженериками), и хотя ранние бета-версии выглядели как код выше, они упростили его окончательную версию:

//int? is shorthand for Nullable<int>
int? i = GetCounterThatMightBeNull(); 

// ?? is shorthand for the null check
int j = i ?? 0;

//or
if( i == null ) {
    //this works even though Nullable<int> is a struct
} 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню