Могут ли дженерики быть вложенными в определение класса - PullRequest
3 голосов
/ 21 января 2010

Я делаю что-то вроде этого:

public abstract class FolderNode<TChildNode,TChildBusObj> : Node
    where TChildNode : MappedNode<TChildBusObj>, new()
    where TChildBusObj : new()
{
..
}

Есть ли способ опустить TChildBusObj из определения, но все же иметь возможность доступа к нему в коде?Например, я хочу иметь возможность выводить универсальный тип универсального типа.Я пробовал это:

public abstract class FolderNode<TChildNode> : Node
    where TChildNode : MappedNode<TChildBusObj>, new()
{
..
}

, но я получаю эту ошибку компиляции:

CS0246: Не удалось найти тип или имя пространства имен 'TChildBusObj' (вы пропустили директиву using или сборкуссылка?)

Обновление 22/01

Я действительно определил, что хочу:

public class Folder<TChildNode, TBusObj> : MappedNode<TBusObj[]>
    where TChildNode : MappedNode<TBusObj>, new()

, который было бы неплохо сократитьна это:

public class Folder<MappedNode<TBusObj>, TBusObj> : MappedNode<TBusObj[]>

Но я не могу, потому что я получаю эту ошибку:

CS0081: Объявление параметра типа должно быть идентификатором, а не типом

Я полагаю, выне может анонимизировать вложенные универсальные типы в определении класса

Ответы [ 4 ]

4 голосов
/ 21 января 2010

Что будет означать TChildBusObj, если вы не определите, к чему это относится?

0 голосов
/ 23 июля 2010

почему не просто

 public class Folder<TBusObj> : MappedNode<TBusObj[]>
 {
     void Add(MappedNode<TBusObj> newChild) { ... }
 }

0 голосов
/ 21 января 2010

Что ж, дело в том, что вы не получили сертификат TChildBusObj.
После компиляции TChildBusObj , который будет использоваться по вашему желанию, станет чем-то вроде параметра.
Во второй реализации нет такого объявления TChildBusObj как универсального параметра, поэтому предполагается, что TChildBusObj является типом, и, как вы, вероятно, не имеете никакого имени после этого он выдаст исключение.
Каждый универсальный параметр, который вы используете в определении класса, должен быть объявлен, поэтому вы можете использовать его свободно.

0 голосов
/ 21 января 2010

Общие аргументы могут быть указаны либо в определении имени класса, либо в определении имени метода.

...