所以,我有一个班级:
internal class GridBox<T> : BoxBase where T : new()
{
public GridBox(Grid grid, GridBoxView view, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button)
: base(grid, icon, caption, button)
{
View = view;
DataSource = dataSource;
}
public GridBoxView View { get; set; }
public ObservableCollection<T> DataSource { get; set; }
}
我在这里使用GridBox
Class
:
public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button) where T : IComparable<T>
{
Window window = Window.GetWindow(sender);
Grid grid = Extensions.FindChild<Grid>(window);
GridBoxView gridBox = new GridBoxView();
return gridBox.Show<T>(new GridBox<T>(grid, gridBox, icon, caption, dataSource, button));
}
我在new GridBox<T>
:
&#39; T&#39;必须是具有公共无参数构造函数的非抽象类型才能将其用作参数&#39; T&#39;在通用类型或方法中
那么,如果T来自new GridBox<T>
,我该如何使用public static T Show<T>
?
答案 0 :(得分:4)
GridBox<T>
对T
有一个约束,要求该类型具有公共无参数构造函数。这是where T : new()
指定的内容。 (见MSDN article on the new constraint)
因此,当您尝试在Show
方法中使用它时,T
那里必须仍然满足此约束。如果您将Show
方法更新为:
public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button)
where T : IComparable<T>, new()
通过将new()
约束添加到Show
,您也将满足GridBox
的约束。
答案 1 :(得分:4)
GridBox
的通用参数应用了一个你不会受到约束的约束,这意味着,如果允许编译,你就可以传入一个没有&#39的类型。 ; t满足其约束。修复当然很简单,将约束添加到您的泛型参数,该类型需要具有无参数构造函数:
public static T Show<T>(...) where T : IComparable<T>, new()
答案 2 :(得分:1)
您需要添加new
约束:
public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button) where T : IComparable<T>, new()
答案 3 :(得分:1)
您还需要将new()约束添加到静态函数中:
public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button) where T : IComparable<T>, new()