проблемы с дженериками в C # параметром - PullRequest
3 голосов
/ 09 апреля 2009

У меня есть такой класс:

Class foo<T> 
{
  anotherfoo<T>;

  foo(){}
  foo(foo<T> aFoo)
  { anotherfoo = aFoo; }
}
void main() 
{
foo<string> obj1 = new foo<string>();
foo<int> obj2 = new foo<int>(obj1);
}

На этот раз я получаю сообщение об ошибке: невозможно преобразовать из foo в foo .

Но мне нужно иметь в этом классе "foo" другой объект foo другого типа, возможно ли это?

Ответы [ 3 ]

12 голосов
/ 09 апреля 2009

Ваш класс Foo<T> имеет поле типа Foo<T>. Это означает, что все, что вы выберете для своего типа T, будет диктовать тип поля.

Альтернативой может быть предоставление неуниверсального базового класса (или интерфейса) как такового:

public abstract class FooBase
{
}

public class Foo<T> : FooBase
{
    private FooBase _anotherFoo;
    ...
}
4 голосов
/ 09 апреля 2009

Вы можете использовать интерфейсы Foo для реализации, которые не являются универсальными и предоставляют не универсальные функциональные возможности.

interface IFoo {
  // add whatever you need here
}

class Foo<T>: IFoo {
  IFoo anotherfoo;

  Foo(){}
  Foo(IFoo aFoo)
  { anotherfoo = aFoo; }
}

void main() {
  Foo<string> obj1 = new Foo<string>();
  Foo<int> obj2 = new Foo<int>(obj1);
}
0 голосов
/ 09 апреля 2009

Другой вариант - ограничить ваш тип T значением IConvertible.

Если вы сделаете это, вы можете добавить метод, который создает foo определенного типа, используя IConvertible.ToType, чтобы преобразовать его непосредственно в ваш тип.

Это будет работать для string и int, а также для любого другого типа, который реализует IConvertible, но только для этих типов.

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