我已经写了一个MVCContrib Html助手csharp的扩展方法,并且对通用约束的形式感到惊讶,它的表面似乎是循环的通过类型参数引用它自己。为什么这个泛型约束似乎有一个循环引用编译
这就是说,该方法编译和按需要工作。
我很想有人解释为什么这个工作,如果存在更直观的直观语法,如果没有人知道为什么?
这里是编译和功能代码,但我已经删除了T列表的例子,因为它阴云密布的问题。
以及使用列表<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'到'MvcContrib.FluentHtml.Elements.TextInput <T>'的装箱转换或类型参数转换。“
和在列表<Ť>情况下的误差(或多个):
“的最好重载方法匹配 'System.Collections.Generic.List.Add(T)' 具有一些无效的参数 参数1:无法从“<空>”转换到“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>
但既不这些编译的。
如已回答已经这不是圆形的,但作为一个侧面说明它可以创建循环继承,有时可以编译,有时不会(例如添加,删除或重命名文件和文件夹可能导致编译随机成功或失败)。所以循环继承的错误确实存在。 (VS2010) – AnorZaken 2015-02-24 02:32:46