Considere el siguiente ejemplo de código, donde Concrete deriva de Base:

class Base{}
class Concrete : Base {}

static void Foo<T>() where T : Base
{
    if (typeof(Concrete).IsAssignableFrom(typeof(T)))
    {
        var x = new Bar<T>(); //compile error on this line
    }
}

class Bar<T> where T : Concrete
{
}

En la línea donde tengo el error de compilación, ya he comprobado que el genérico argumento es asignable a la Concrete tipo. Así que en teoría creo que debería haber una forma para crear una instancia de la Barra de clase.

Es existe alguna manera de que me puede quitar el error de compilación? No puedo pensar en una manera de lanzar el argumento.


Texto completo de error de compilación:

14 de Error Del tipo ‘T’ no puede ser utilizado como parámetro de tipo ‘T’ en el
de tipo genérico o método
‘Bar’. Allí
no es la referencia implícita a la conversión de ‘T’ para
‘Concreto’.

Que compila para mí… es que el real ejemplo? hay quizás parámetros en el código real?
El código no coincide con el mensaje de error. Seguramente usted escribió Bar<T>();
Hay una razón por la que Foo no tiene where T : Concrete?
durante la edición, puede que también desee aclarar la relación entre Base y Concrete
gracias, con que editar: no existe una manera de hacerlo. Se puede hackear con la reflexión (MakeGenericMethod etc), pero que no es un bien respuesta. Si usted puede quitar la restricción de Bar<T> y hacer algún casting (a través de object) dentro de Bar<T>, que podría funcionar.

OriginalEl autor Zaid Masud | 2012-11-06

1 Comentario

  1. 4

    El compilador no tiene forma de saber que T, que actualmente es la restricción de la Base es la realidad Concreta, y que incluso si una prueba antes.

    Así:

    Type type = typeof(Bar<>);
    Type generic = type.MakeGenericType(typeof(T));
    var x = Activator.CreateInstance(generic); 

    No dejes que la oportunidad de hacerlo.

    OriginalEl autor LightStriker

Dejar respuesta

Please enter your comment!
Please enter your name here