He escrito un método de extensión en csharp para un helper MVCContrib Html y me sorprendió la forma de la restricción genérica, que a primera vista parece circularmente referencia a sí mismo a través del parámetro tipo.¿Por qué esta compilación genérica se compila cuando parece tener una referencia circular
Dicho esto, el método se compila y funciona como se desee.
Me gustaría que alguien explicara por qué funciona esto y si existe una sintaxis intuitiva más intuitiva y si no, si alguien sabe por qué?
Aquí está el código de compilación y función, pero he eliminado el ejemplo de la Lista de T, ya que nubló el problema.
, así como un método análogo utilizando una lista <T>.
namespace MvcContrib.FluentHtml
{
public static class FluentHtmlElementExtensions
{
public static TextInput<T> ReadOnly<T>(this TextInput<T> element, bool value)
where T: TextInput<T>
{
if (value)
element.Attr("readonly", "readonly");
else
((IElement)element).RemoveAttr("readonly");
return element;
}
}
}
/*analogous method for comparison*/
public static List<T> AddNullItem<T>(this List<T> list, bool value)
where T : List<T>
{
list.Add(null);
return list;
}
En el primer método de la restricción T: T TextInput < > parece a todos los efectos, circular. Sin embargo, si comento a cabo consigo un error del compilador:
"El tipo 'T' no se puede utilizar como parámetro de tipo 'T' en el tipo genérico o método 'MvcContrib.FluentHtml.Elements.TextInput <T>' No hay conversión de cuadro ni conversión de parámetro de tipo de 'T' a 'MvcContrib.FluentHtml.Elements.TextInput <T>'. "
y en la lista <T> caso el error (s) son:
"El partido mejor método sobrecargado para 'System.Collections.Generic.List.Add (T)' tiene alguna argumentos no válidos argumento 1: no se puede convertir de '<nula>' a 'T'"
me podía imaginar una definición más intuitiva sería uno que incluye 2 tipos, una referencia t o el tipo genérico y una referencia a la Limitar a tipo por ejemplo:
public static TextInput<T> ReadOnly<T,U>(this TextInput<T> element, bool value)
where U: TextInput<T>
o
public static U ReadOnly<T,U>(this U element, bool value)
where U: TextInput<T>
pero ninguno de estos compilación.
Como ha sido contestada ya que esto no es circular, sin embargo, como una nota al margen es que es posible crear una herencia circular que a veces compila y otras veces no (como al agregar, eliminar o renombrar archivos y carpetas, la compilación puede tener éxito al azar o fallar). Así que existen errores con herencia circular. (VS2010) – AnorZaken