Обнуляемая родовая декларация? - PullRequest
2 голосов
/ 08 февраля 2010

Скажи, у меня есть объект,

Class A<T, T2>
{
   public T MyObject {get;set;}
   public IList<A<T2>> MyChildren {get;set;} 
}

Проблема в том, что иногда у меня нет детей, поэтому я не хочу объявлять тип детей aka T2, есть идеи? Я не могу пройти как

A a = new A<string, Nullable>(); as it is throwing an error.

Спасибо

Ответы [ 2 ]

4 голосов
/ 08 февраля 2010

Нет никакого способа указать «ноль» для параметра универсального типа - если вы объявляете их в классе, они обязательны при использовании этого класса.

Если подумать, это имеет смысл, потому что без T2 ваш класс будет частично неопределенным, а это не то, с чем машины могут справиться хорошо.

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

class Widget<T>
{
    public T MyObject { get; set; }
}

Затем расширение, которое добавляет поддержку для детей:

class WidgetWithChildren<T,T2>: Widget<T>
{
    public IList<Widget<T>> MyChildren { get; set; }
}

Хотя это только частичное решение, так как вы не можете справиться с внуками.

0 голосов
/ 08 февраля 2010

Nullable сам по себе является родовым, поэтому вы должны сделать что-то вроде

new A<string, Nullable<?>>(); 

Вы используете Nullable, чтобы типы значений (например, int) могли быть нулевыми, но если вы используете тип ссылки (например, класс), он может быть нулевым в любом случае. Мой совет - использовать базовый класс для A, если у вас нет одного объекта Object.

new A<string, Object>(); 
...