Re: error CS0310: The type 'Foo' must have a public paramete
От: ie Россия http://ziez.blogspot.com/
Дата: 21.09.06 07:10
Оценка: 2 (2) +2
Здравствуйте, <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>>
Превратим окружающую нас среду в воскресенье.
error CS0310: The type 'Foo' must have a public parameterles
От: Аноним  
Дата: 21.09.06 06:06
Оценка:
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".
Re: error CS0310: The type 'Foo' must have a public paramete
От: BluntBlind  
Дата: 21.09.06 06:21
Оценка:
А не abstract ли причина ошибки?

А>
А>public class Generic<T> where T : new() { }

А>public abstract class Foo
А>{
А>    public Foo() { }
А>}
А>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: error CS0310: The type 'Foo' must have a public paramete
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.09.06 13:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ведь у класса 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>();
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.