usar una que programacion porque orientada objetos interfaz interfaces implementacion herencia ejemplos clases abstractas c# generics type-parameter

c# - porque - que es una interfaz en programacion orientada a objetos



¿Por qué no puedo usar ''como'' con un parámetro de tipo genérico que está restringido para ser una interfaz? (1)

En el siguiente ejemplo (solo para fines de demostración), si T no está restringido por clase, entonces esta conversión:

var ret = objectA as T;

... provocará el siguiente error de compilación:

El parámetro de tipo ''T'' no se puede usar con el operador ''como'' porque no tiene una restricción de tipo de clase ni una restricción de ''clase''.

No puedo entender por qué no puedo hacer esto. Como he restringido a T para que sea la interfaz IObject , el compilador debe saber que T debe ser un tipo de interfaz y la operación as debe ser válida.

public interface IObject { string Id { get; set; } } public class ObjectA : IObject { public string Id { get; set; } } public class ObjectFactory { public T CreateObject<T>(string id) where T : IObject { ObjectA objectA = new ObjectA(); var x = objectA as IObject; // this is good var ret = objectA as T; // why this ''as'' cannot compile? return ret; } public T CreateClassObject<T>(string id) where T : class, IObject { ObjectA objectA = new ObjectA(); var ret = objectA as T; // if T is class, this ''as'' can compile return ret; } }


dado que he restringido a T para que sea la interfaz IObject, el compilador debe saber que T debe ser un tipo de interfaz y la operación ''como'' debe ser válida.

No, T no tiene que ser un tipo de interfaz. Tiene que ser un tipo que implemente la interfaz . Considerar:

public struct Foo : IObject { public string Id { get; set; } }

Ahora, ¿qué esperaría que hiciera CreateObject<Foo>("ff") ?

Con la restricción de class en CreateObject , esa llamada no sería válida porque Foo no es un tipo de referencia; el compilador sabe que T es un tipo de referencia, por lo que objectA as T está bien.