punto - Genéricos de C#: Restricción de T donde T: el objeto no se compila; Error: la restricción no puede ser una clase especial ''objeto''
el programa no contiene ningún método main estático adecuado para un punto de entrada (3)
Cuando restringo la T con: Objeto como este:
public interface IDoWork<T> where T : Object
{
T DoWork();
}
Me sale el error:
Restricción no puede ser clase especial ''objeto''
¿Significa eso que hay una diferencia implícita con lo siguiente que compila?
public interface IDoWork<T> // where T : Object
{
T DoWork();
}
No hay diferencia entre las dos restricciones, a excepción de que una no está permitida por ser inútil declarar explícitamente.
La especificación de lenguaje C # 4.0 (10.1.5 Tipo de restricciones de parámetros) dice dos cosas sobre esto:
El tipo no debe ser objeto. Debido a que todos los tipos se derivan de un objeto, tal restricción no tendría ningún efecto si estuviera permitida.
...
Si T no tiene restricciones primarias o restricciones de parámetros de tipo, su clase base efectiva es el objeto.
En tu comentario, dijiste que estabas intentando hacer que T
fuera del tipo Void
. Void
es un tipo especial que indica que no hay un tipo de retorno y no se puede usar en lugar de T
, que requiere un tipo concreto adecuado. Tendrá que crear una versión nula de su método y una versión T
si desea ambos.
Según la especificación de lenguaje C # 4.0 (Codificado: [10.1.5] Tipo de restricciones de parámetros) dice dos cosas:
1] El tipo no debe ser objeto. Debido a que todos los tipos se derivan de un objeto, tal restricción no tendría ningún efecto si estuviera permitida.
2] Si T no tiene restricciones primarias o restricciones de parámetros de tipo, su clase base efectiva es el objeto.
Cuando define una clase genérica, puede aplicar restricciones a los tipos de tipos que el código de cliente puede usar para los argumentos de tipo cuando crea una instancia de su clase. Si el código del cliente intenta crear una instancia de su clase utilizando un tipo que no está permitido por una restricción, el resultado es un error en tiempo de compilación. Estas restricciones se denominan restricciones. Las restricciones se especifican utilizando la palabra clave donde contextual. Si desea restringir un tipo genérico para que sea un tipo de referencia, use: class.
Según MSDN
La restricción no puede ser un ''identificador'' de clase especial. Los siguientes tipos no pueden usarse como restricciones:
- Sistema.Objeto
- System.Array
- System.Delegate
- System.Enum
- System.ValueType.
Si desea restringir un tipo genérico para que sea un tipo de referencia, use : class
.
public interface IDoWork<T> where T : class
{
T DoWork();
}
Esto prohibirá que el tipo genérico sea un tipo de valor, como int
o una estructura.