我已經寫了一個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