Error del compilador CS0311

Actualización: noviembre 2007

Mensaje de error

El tipo 'tipo1' no se puede usar como parámetro de tipo 'T' en el tipo o método genérico '<nombre>'. No hay ninguna conversión de referencia implícita de 'tipo1' a 'tipo2'.
The type 'type1' cannot be used as type parameter 'T' in the generic type or method '<name>'. There is no implicit reference conversion from 'type1' to 'type2'.

Cuando se aplica una restricción a un parámetro de tipo genérico, debe existir una conversión de referencia o identidad implícita del argumento concreto al tipo de la restricción.

Para corregir este error

  1. Cambie el argumento que está utilizando para crear la clase.

  2. Si es el propietario de la clase, puede quitar la restricción o bien habilitar una conversión de identidad o referencia implícita de alguna forma. Por ejemplo, puede hacer que el segundo tipo herede del primero.

Ejemplo

// cs0311.cs
class B{}
class C{}
class Test<T> where T : C
{ }

class Program
{
    static void Main()
    {
        Test<B> test = new Test<B>(); //CS0311
    }
}

Si este error se produce al intentar utilizar un argumento de tipo de valor, tenga en cuenta que una conversión numérica implícita, por ejemplo de short a int, no satisface un parámetro de tipo genérico.

Vea también

Referencia

Restricciones de tipos de parámetros (Guía de programación de C#)