泛型接口的類型是否可能基於特定的父類?C#泛型能否具有特定的基本類型?
例如:
public interface IGenericFace<T : BaseClass>
{
}
顯然上面的代碼不工作,但如果沒有,我想告訴編譯器是T
必須是子類的BaseClass
。這能做到嗎,有沒有計劃等等?
我認爲這對於一個特定的項目來說很有用,確保在編譯時一個通用的接口/類不會被用於非預期的類型。或者也可以對自我文件進行排序:顯示打算使用哪種類型的文件。
泛型接口的類型是否可能基於特定的父類?C#泛型能否具有特定的基本類型?
例如:
public interface IGenericFace<T : BaseClass>
{
}
顯然上面的代碼不工作,但如果沒有,我想告訴編譯器是T
必須是子類的BaseClass
。這能做到嗎,有沒有計劃等等?
我認爲這對於一個特定的項目來說很有用,確保在編譯時一個通用的接口/類不會被用於非預期的類型。或者也可以對自我文件進行排序:顯示打算使用哪種類型的文件。
public interface IGenericFace<T> where T : SomeBaseClass
是的。
public interface IGenericFace<T>
where T : BaseClass
{
}
什麼你指的是被稱爲「通用約束」。可以對通用類型施加大量限制。
一些基本的例子如下:
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)
您可以在HTTP上找到如何約束類型的詳細信息:/ /msdn.microsoft.com/en-us/library/d5x73970(VS.80)。aspx – tvanfosson 2008-10-23 18:01:49
@Kyralessa,是否有可能有一個泛型基類 – Demodave 2015-06-02 20:27:20