public class Generic<T> where T : new() { }
public abstract class Foo
{
public Foo() { }
}
public class Program
{
public static void Main()
{
// error CS0310: The type 'Foo' must have a public parameterless constructor
// in order to use it as parameter 'T' in the generic type or method 'Generic<T>'
new Generic<Foo>();
}
}
Ведь у класса Foo
есть public parameterless constructor! На что ругается компилятор?
P.S. А РеШарпер ему вторит: "Type argument has no default constructor".
А не abstract ли причина ошибки?
А>А>public class Generic<T> where T : new() { }
А>public abstract class Foo
А>{
А> public Foo() { }
А>}
А>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, <Aiiiei>, Вы писали:
Aii>Ведь у класса Foo есть public parameterless constructor! На что ругается компилятор?
Aii>P.S. А РеШарпер ему вторит: "Type argument has no default constructor".
If the constraint is the constructor constraint new(), the type argument A shall not be abstract and
shall have a public parameterless constructor. This is satisfied if one of the following is true:
o A is a value type, since all value types have a public default constructor (§11.1.2).
o A is a type parameter having the value type constraint (§25.7).
o A is a class that is not abstract, A contains an explicitly declared public constructor with no
parameters.
o A is not abstract and has a default constructor (§17.10.4).
... << RSDN@Home 1.2.0 alpha rev. 0>>
Здравствуйте, Аноним, Вы писали:
А>Ведь у класса Foo есть public parameterless constructor! На что ругается компилятор?
А>P.S. А РеШарпер ему вторит: "Type argument has no default constructor".
Да, действительно, в этом случае компилятор выдает не совсем точную диагностику. Но это не умаляет того факта, что Вы не можете указать abstract класс в качестве type parameter, для которого установлено ограничение new().
public class Generic<T> where T : new()
{
private T _t;
public Generic()
{
_t = new T(); // иначе здесь создался бы экземпляр абстрактного типа, что не есть хорошо
}
}
public abstract class Foo
{
public Foo() { }
}
public class Program
{
public static void Main()
{
// error CS0310: The type 'Foo' must have a public parameterless constructor
// in order to use it as parameter 'T' in the generic type or method 'Generic<T>'
new Generic<Foo>();
}
}