對於C#泛型,只允許您對通用類型參數的實例執行這些操作,這些操作對於編譯器來說是已知的,以便存在於適合泛型類型約束的任何類型中,如通用類型或泛型方法。換句話說,在你的具體情況下,編譯器有兩個問題。
首先,您嘗試構建T的一個實例,但並非每種類型都可以像這樣構造(例如代表不能)。此外,不是每個可構造的類型是默認構造(換句話說有一個默認的構造函數)。爲了能夠構建這樣的類型T的實例,你需要需要噸至有一個默認的構造函數對T.
應用
新()約束
其次,要能夠初始化屬性值和文本在新構建的T實例上,您需要確保類型T指定了這些屬性,並且這些屬性是public和可設置,通常通過強制T實現某個接口來完成。
這是你可能想在代碼中做什麼的一個小例子。
interface IHasStringValueAndText {
String Value { get; set; }
String Text { get; set; }
}
public static List<T> GetList<T>(dynamic data) where T : IHasStringValueAndText, new() {
var lst = new List<T>();
foreach (var d in data) {
lst.Add(new T { Value = d.Id.ToString(), Text = d.Name });
}
return lst;
}
請注意,如果你並不真正需要的類約束爲您的特定情況下工作,但它可能對你今後的工作有用。
爲什麼不使用接口? – JuanR
你對'T'沒有限制。編譯器不知道'T'具有'Value'或'Text'屬性。 – Jonesopolis
您將您的類型限制爲T,但不提供該類型的附加約束。編譯器無法知道是否存在屬性Value或Text。 – Igor