當您將方法指派給委派時, 共變數 和 反變數 可提供彈性來比對具有方法簽章的委派類型。 共變數允許方法的傳回型別比委派中所定義的衍生類型還要多。 Contravariance 允許方法具有比委派類型中更低衍生的參數類型。
範例 1:共變數
說明
這個範例示範如何搭配方法使用委派,這些方法具有衍生自委派簽章中傳回型別的方法。
DogsHandler
返回的資料類型是 Dogs
類型,該類型從委派中定義的 Mammals
類型衍生而來。
程式碼
class Mammals {}
class Dogs : Mammals {}
class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();
public static Mammals MammalsHandler()
{
return null;
}
public static Dogs DogsHandler()
{
return null;
}
static void Test()
{
HandlerMethod handlerMammals = MammalsHandler;
// Covariance enables this assignment.
HandlerMethod handlerDogs = DogsHandler;
}
}
範例 2:反變數
說明
此範例示範如何使用委派來搭配那些其參數類型為委派簽名參數基礎類型的方法。 使用反變數時,您可以使用一個事件處理程式,而不是個別的處理程式。 下列範例會使用兩個委派:
KeyEventHandler委派,定義 Button.KeyDown 事件的簽章。 其簽章為:
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
定義MouseEventHandler事件簽章的委派。 其簽章為:
public delegate void MouseEventHandler(object sender, MouseEventArgs e)
此範例會使用 EventArgs 參數定義事件處理程式,並用它來處理 Button.KeyDown
和 Button.MouseClick
事件。 它能夠這樣做是因為 EventArgs 是 KeyEventArgs 和 MouseEventArgs 的基底類型。
程式碼
// Event handler that accepts a parameter of the EventArgs type.
private void MultiHandler(object sender, System.EventArgs e)
{
label1.Text = System.DateTime.Now.ToString();
}
public Form1()
{
InitializeComponent();
// You can use a method that has an EventArgs parameter,
// although the event expects the KeyEventArgs parameter.
this.button1.KeyDown += this.MultiHandler;
// You can use the same method
// for an event that expects the MouseEventArgs parameter.
this.button1.MouseClick += this.MultiHandler;
}