2008-10-23 98 views
34

泛型接口的類型是否可能基於特定的父類?C#泛型能否具有特定的基本類型?

例如:

public interface IGenericFace<T : BaseClass> 
{ 
} 

顯然上面的代碼不工作,但如果沒有,我想告訴編譯器是T必須是子類的BaseClass。這能做到嗎,有沒有計劃等等?

我認爲這對於一個特定的項目來說很有用,確保在編譯時一個通用的接口/類不會被用於非預期的類型。或者也可以對自我文件進行排序:顯示打算使用哪種類型的文件。

回答

81
public interface IGenericFace<T> where T : SomeBaseClass 
+2

您可以在HTTP上找到如何約束類型的詳細信息:/ /msdn.microsoft.com/en-us/library/d5x73970(VS.80)。aspx – tvanfosson 2008-10-23 18:01:49

+0

@Kyralessa,是否有可能有一個泛型基類 – Demodave 2015-06-02 20:27:20

5

是的。

public interface IGenericFace<T> 
    where T : BaseClass 
{ 
} 
59

什麼你指的是被稱爲「通用約束」。可以對通用類型施加大量限制。

一些基本的例子如下:

  • where T: struct - 類型參數必須是一個值類型。可以指定除Nullable之外的任何值類型。有關更多信息,請參見Using Nullable Types (C# Programming Guide)

  • where T : class - 類型參數必須是引用類型;這也適用於任何類,接口,委託或數組類型。

  • where T : new() - 類型參數必須具有公共無參數構造函數。與其他約束一起使用時,必須最後指定new()約束。

  • where T : <base class name> - 類型參數必須是或從指定的基類派生。

  • where T : <interface name> - 類型參數必須是或實現指定的接口。可以指定多個接口約束。約束接口也可以是通用的。

  • where T : U - 爲T提供的類型參數必須來自爲U提供的參數。這被稱爲裸類型約束。

這些也可以連接在一起,就像這樣:

C#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { } 
public interface IGenericFace<T> where T : SomeBaseClass 

VB

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New}) 
Public Interface IGenericInterface(Of T As SomeBaseClass)