为什么我不能强制派生类来拥有无参数构造函数?

时间:2010-04-16 08:55:58

标签: c# generics

我正在尝试执行以下操作:

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()'约束。

6 个答案:

答案 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>();
}

对我来说工作!