2014-06-20 48 views
2

所以,我有一個類:如何使用泛型

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; } 
} 

我用這個GridBoxClass這裏:

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>

'T'必須是一個具有公共無參數構造函數的非抽象類型,以便在泛型類型或方法中將其用作參數'T'

那麼,如果T來自public static T Show<T>,我該如何使用new GridBox<T>

回答

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

您需要添加new約束:

public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button) where T : IComparable<T>, new() 
+0

所有的答案都是正確的,但只能選擇1作爲答案,對不起。 – Krowi

4

GridBox的泛型參數應用了一個你不需要的約束,這意味着如果允許編譯這個約束,你就可以傳入一個不符合約束的類型。解決方法是當然簡單,約束添加到通用的說法,類型需要有一個無參數的構造函數:

public static T Show<T>(...) where T : IComparable<T>, new() 
+0

所有的答案都是對的,但只能選擇1作爲答案,對不起。 – Krowi

1

你需要新的()約束添加到您的靜態功能以及:

public static T Show<T>(DependencyObject sender, MessageBoxIcon icon, string caption, ObservableCollection<T> dataSource, MessageBoxButton button) where T : IComparable<T>, new() 
+0

所有答案都是對的,但只能選擇1作爲答案,對不起。 – Krowi