對於泛型型別參數, in 關鍵詞會指定類型參數為反變數。 您可以在泛型介面和委派中使用 in 關鍵詞。
Contravariance 可讓您使用比泛型參數指定的衍生類型少。 這允許實作反變數介面的類別隱含轉換,以及委派類型的隱含轉換。 參考型別支援泛型型別參數中的共變數和反變數,但實值型別不支援共變數。
只有在類型定義方法參數的類型,而不是方法的傳回型別時,才能在泛型介面中宣告為反變數或委派。
In、 ref和 out 參數必須不變異,這表示它們既不是共變數,也不是反變數。
具有反變數型別參數的介面可讓其方法接受衍生型別自變數比介面類型參數所指定的自變數還要少。 例如,在 介面中IComparer<T>,T 類型為反變數,您可以在繼承 Person時Employee,將型別的物件IComparer<Employee>指派IComparer<Person>給型別的物件,而不使用任何特殊的轉換方法。
反變數委派可以指派相同類型的另一個委派,但具有較不衍生的泛型型別參數。
如需詳細資訊,請參閱 共變數和反變數。
Contravariant 泛型介面
下列範例示範如何宣告、擴充及實作Contravariant泛型介面。 它也會示範如何針對實作這個介面的類別使用隱含轉換。
// Contravariant interface.
interface IContravariant<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
class Program
{
static void Test()
{
IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
}
}
Contravariant 泛型委派
下列範例示範如何宣告、具現化及叫用反變數泛型委派。 它也會示範如何隱含地轉換委派類型。
// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }
public void Test()
{
// Instantiating the delegates with the methods.
DContravariant<Control> dControl = SampleControl;
DContravariant<Button> dButton = SampleButton;
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
// Invoke the delegate.
dButton(new Button());
}
C# 語言規格
如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法和使用方式的最終來源。