我在csharp中为MVCContrib Html助手编写了一个扩展方法,并对通用约束的形式感到惊讶,从表面看它通过类型参数循环引用自身.
据说这种方法可以根据需要进行编译和工作.
我希望有人解释为什么这有效,如果存在更直观的直观语法,如果没有人知道为什么?
这是编译和功能代码,但我删除了T的例子,因为它使问题蒙上阴影.以及使用List <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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
/*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;
}
Run Code Online (Sandbox Code Playgroud)
在第一种方法中,约束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>
Run Code Online (Sandbox Code Playgroud)
要么 …