我正在尝试执行以下操作:
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'的预初始化对象作为构造函数参数传递,以避免必须“新”它,但有没有办法解决这个问题?任何方法来强制从'bar'派生的类来提供无参数构造函数?
已修复 - 我在AnotherClass()上缺少'new()'约束。
答案 0 :(得分:7)
正确的语法是
public class foo<T> where T : bar, new()
答案 1 :(得分:5)
你是不是在你的AnotherClass上错过了一个new()约束?
public class AnotherClass<T> where T : bar, new()
如果没有VS2010拒绝编译,那就可以了。
答案 2 :(得分:1)
您的代码在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
}
答案 3 :(得分:0)
通用语法new()不是新的吗?
另外,你是在一个类的中间而不是在一个函数中执行这个代码,这肯定会让它感到困惑:
_t = new T();
修改强>
好的,所以在语法清理之后,我猜测问题是'baz'没有无参数构造函数。我不知道你可以用什么方式强制执行此操作。
有一个类似的问题here,这可能会有所帮助。
答案 4 :(得分:0)
与解决方法类似 - 您可以传递委托创建所需类型的实例:
Func<T> creator = ...
_t = creator();
答案 5 :(得分:0)
首先从类“Foo”的关键字“where”中删除“new()” 之后必须改变构造函数为
public foo()
{
_t = Activator.CreateInstance<T>();
}
对我来说工作!