проблемы с дженериками в C# в параметре

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

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‹string> в foo‹int>.

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


person Community    schedule 09.04.2009    source источник
comment
Почему класс вообще должен быть универсальным?   -  person Guffa    schedule 09.04.2009
comment
Как вы ожидаете, что среда выполнения преобразует строку в целое число? преобразование должно существовать, скорее всего, вы хотите разобрать строковое число на реальное число.   -  person meandmycode    schedule 09.04.2009


Ответы (3)


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

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

public abstract class FooBase
{
}

public class Foo<T> : FooBase
{
    private FooBase _anotherFoo;
    ...
}
person Kent Boogaart    schedule 09.04.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);
}
person Lucero    schedule 09.04.2009

Другой вариант — ограничить тип T до IConvertible.

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

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

person Reed Copsey    schedule 09.04.2009