Error del compilador CS0313

Actualización: noviembre 2007

Mensaje de error

El tipo 'tipo1' no se puede usar como parámetro de tipo 'nombre de parámetro' en el tipo o método genérico 'tipo2'. El tipo que acepta valores NULL 'tipo1' no cumple la restricción de 'tipo2'. Los tipos que aceptan valores NULL no pueden cumplir restricciones de interfaz.
The type 'type1' cannot be used as type parameter 'parameter name' in the generic type or method 'type2'. The nullable type 'type1' does not satisfy the constraint of 'type2'. Nullable types cannot satisfy any interface constraints.

Un tipo que acepta valores NULL no es equivalente a su homólogo que no acepta valores NULL. En el ejemplo siguiente, ImplStruct cumple la restricción BaseInterface pero ImplStruct? no la cumple porque Nullable<ImplStruct> no implementa BaseInterface.

Para corregir este error

  • Utilizando el código de ejemplo siguiente, una solución consiste en especificar un elemento ImplStruct ordinario como primer argumento de tipo en la llamada a TestMethod. A continuación, se modifica TestMethod para crear una versión que acepte valores NULL de Implstruct en su instrucción return:

    return new Nullable<T>(t);
    

Ejemplo

El código siguiente genera el error CS0313:

// cs0313.cs
public interface BaseInterface { }
public struct ImplStruct : BaseInterface { }

public class TestClass
{
    public T? TestMethod<T, U>(T t) where T : struct, U
    {
        return t;
    }
}

public class NullableTest
{
    public static void Run()
    {

        TestClass tc = new TestClass();
        tc.TestMethod<ImplStruct?, BaseInterface>(new ImplStruct?()); // CS0313
    }
    public static void Main()
    { }
}

Vea también

Referencia

Tipos que aceptan valores NULL (Guía de programación de C#)