尽管如此,该方法编译并按预期工作。
我希望有人能解释为什么这样可以工作,以及是否存在更直观的语法,如果没有,是否有人知道原因?
以下是编译和函数代码,但我已经删除了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;
}
在第一种方法中,约束条件 T:TextInput<T> 似乎在很大程度上是循环的。但是,如果我注释掉它,就会出现编译器错误: "类型'T'不能用作泛型类型或方法'MvcContrib.FluentHtml.Elements.TextInput<T>'的类型参数'T'。从'T'到'MvcContrib.FluentHtml.Elements.TextInput <T>'没有装箱转换或类型参数转换。" 而在 List<T> 的情况下,错误如下: "最佳重载方法'System.Collections.Generic.List.Add(T)'有一些无效的参数 参数1: 无法将“<null>”转换为“T”" 我可以想象一个更直观的定义应该包括2种类型,一种是对泛型类型的引用,另一种是对约束类型的引用,例如:
public static TextInput<T> ReadOnly<T,U>(this TextInput<T> element, bool value)
where U: TextInput<T>
或者
public static U ReadOnly<T,U>(this U element, bool value)
where U: TextInput<T>
但是这两个都无法编译。