que medicamentos medicamento marca listado lista genericos generico entre ejemplos diferencia desventajas comerciales comercial c# generics

c# - marca - medicamentos genericos listado



¿Pueden los genéricos de C#tener un tipo base específico? (4)

¿Es posible que el tipo de una interfaz genérica se base en una clase principal específica?

Por ejemplo:

public interface IGenericFace<T : BaseClass> { }

Obviamente, el código anterior no funciona, pero si lo hizo, lo que intento decirle al compilador es que T debe ser una subclase de BaseClass . ¿Se puede hacer eso, hay planes para ello, etc.?

Creo que sería útil en términos de un proyecto específico, asegurándose de que una clase / interfaz genérica no se utilice con tipo (s) no deseado (s) en el momento de la compilación. O también a una especie de auto-documento: mostrar qué tipo de tipo está destinado.


A lo que se está refiriendo se le llama "Restricciones genéricas". Existen numerosas restricciones que se pueden poner en un tipo genérico.

Algunos ejemplos básicos son los siguientes:

  • where T: struct - El argumento tipo debe ser un tipo de valor. Cualquier tipo de valor excepto Nullable - se puede especificar. Consulte Uso de tipos anulables (Guía de programación C #) para obtener más información.

  • where T : class - El argumento tipo debe ser un tipo de referencia; esto se aplica también a cualquier clase, interfaz, delegado o tipo de matriz.

  • where T : new() - El argumento tipo debe tener un constructor público sin parámetros. Cuando se usa junto con otras restricciones, la restricción new() debe especificarse al final.

  • where T : <base class name> - El argumento de tipo debe ser o derivar de la clase base especificada.

  • where T : <interface name> - El argumento de tipo debe ser o implementar la interfaz especificada. Se pueden especificar múltiples restricciones de interfaz. La interfaz restrictiva también puede ser genérica.

  • where T : U - El argumento de tipo suministrado para T debe ser o derivar del argumento proporcionado para U Esto se llama restricción de tipo desnudo.

Estos también pueden vincularse de esta manera:

DO#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { } public interface IGenericFace<T> where T : SomeBaseClass

VB

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New}) Public Interface IGenericInterface(Of T As SomeBaseClass)



sí.

public interface IGenericFace<T> where T : BaseClass { }


public interface IGenericFace<T> where T : SomeBaseClass