这是一个实例,如果您删除逆变in
标记,它将无法编译:
delegate void Callback<in T>(T t);
public Form1()
{
InitializeComponent();
Callback<Control> showText = control => MessageBox.Show(control.Text);
var button = new Button();
AddButtonClickCallback(button, showText);
var label = new Label();
AddLabelClickCallback(label, showText);
}
static void AddButtonClickCallback(Button button, Callback<Button> callback)
{
button.Click += delegate { callback(button); };
}
static void AddLabelClickCallback(Label label, Callback<Label> callback)
{
label.Click += delegate { callback(label); };
}
有点做作,当然,但至少应该让您了解没有它就不能做的事情。
尤其要考虑 ifAddLabelClickCallback
和AddButtonClickCallback
were 库函数并且Callback
是库委托。如果它是在没有逆变的情况下定义的,则您必须定义不同的委托showButtonText
,showLabelText
即使您只是希望它们做同样的事情。