Я пытаюсь сделать следующее:
class Program
{
static void Main(string[] args)
{
foo<baz> fooObject = new foo<baz>();
AnotherClass<baz> _baz = new AnotherClass<baz>();
_baz.testMethod(fooObject);
}
}
public class AnotherClass<T> where T : bar
{
public void testMethod(foo<T> dummy)
{
foobar = dummy;
}
private foo<T> foobar = null;
}
public class foo<T> where T : bar, new()
{
public foo()
{
_t = new T();
}
private T _t;
}
public abstract class bar
{
public abstract void someMethod();
// Some implementation
}
public class baz : bar
{
public override void someMethod()
{
//Implementation
}
}
И я получаю ошибку при объяснении, что 'T' должен быть неабстрактным типом с общедоступным конструктором без параметров для использования его в качестве параметра 'T' в универсальном типе или методе. Я полностью понимаю, почему это должно быть, и также понимать, что я мог передать предварительно инициализированный объект типа 'T' в как аргумент конструктора для избегания необходимости 'новый' это, но являюсь там каким-либо путем вокруг этого? какой-либо способ осуществить классы, которые происходят из 'панели' для предоставления конструкторов без параметров?
Зафиксированный - я отсутствовал 'новый ()' ограничение на AnotherClass ().
Разве вы не упускаете ограничение new () для вашего AnotherClass?
public class AnotherClass<T> where T : bar, new()
Без этого VS2010 отказывается компилироваться, с этим он работает нормально.
Правильный синтаксис:
public class foo<T> where T : bar, new()
Разве общий синтаксис new () не просто new?
Кроме того, вы выполняете этот код в середине класса, а не в функции, что наверняка сбивает его с толку:
_t = new T();
Изменить:
Хорошо, поэтому после очистки синтаксиса я предполагаю, что проблема в том, что у 'baz' нет конструктора без параметров. Я не знаю, каким образом вы можете добиться этого.
Здесь есть аналогичный вопрос , который может немного помочь.
Ваш код компилируется в VS2010.
Вы, вероятно, захотите использовать вместо этого интерфейсы:
public class foo<T> where T : ibar, new()
...
public interface ibar
{
void someMethod();
}
public abstract class bar : ibar
{
public abstract void someMethod();
// Some implementation
}
Как обходной путь - вы можете передать делегату создание экземпляра типа, который вы нужно:
Func<T> creator = ...
_t = creator();