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()
{ }
}