如何使用泛型

时间:2014-06-20 20:40:51

标签: c# generics

所以,我有一个班级:

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>

4 个答案:

答案 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()