다음을 통해 공유


공변성 및 반공변성(C#)

C#에서 공변성 및 반공변성에서는 배열 형식, 대리자 형식 및 제네릭 형식 인수에 대한 암시적 참조 변환을 사용하도록 설정합니다. 공변성은 할당 호환성을 유지하고 반공변성은 반대로 합니다.

다음 코드에서는 할당 호환성, 공변성 및 반공변성 간의 차이를 보여 줍니다.

// Assignment compatibility.
string str = "test";  
// An object of a more derived type is assigned to an object of a less derived type.
object obj = str;  
  
// Covariance.
IEnumerable<string> strings = new List<string>();  
// An object that is instantiated with a more derived type argument
// is assigned to an object instantiated with a less derived type argument.
// Assignment compatibility is preserved.
IEnumerable<object> objects = strings;  
  
// Contravariance.
// Assume that the following method is in the class:
static void SetObject(object o) { }
Action<object> actObject = SetObject;  
// An object that is instantiated with a less derived type argument
// is assigned to an object instantiated with a more derived type argument.
// Assignment compatibility is reversed.
Action<string> actString = actObject;  

배열의 공변성으로 더 파생된 형식의 배열을 덜 파생된 형식의 배열로 암시적으로 변환할 수 있습니다. 그러나 이 작업은 다음 코드 예제와 같이 형식이 안전하지 않습니다.

object[] array = new String[10];  
// The following statement produces a run-time exception.  
// array[0] = 10;  

메서드 그룹에 대한 공변성 및 반공변성 지원을 사용하면 메서드 시그니처를 대리자 형식과 일치할 수 있습니다. 이렇게 하면 일치하는 서명이 있는 메서드뿐만 아니라 더 많은 파생 형식(공변성)을 반환하거나 대리자 형식에서 지정한 것보다 파생 형식(반공변성)이 적은 매개 변수를 허용하는 메서드에도 할당할 수 있습니다. 자세한 내용은 대리자에서 분산(C#)대리자에서 분산 사용(C#)을 참조하세요.

다음 코드 예제에서는 메서드 그룹에 대한 공변성 및 반공변성 지원을 보여줍니다.

static object GetObject() { return null; }  
static void SetObject(object obj) { }  
  
static string GetString() { return ""; }  
static void SetString(string str) { }  
  
static void Test()  
{  
    // Covariance. A delegate specifies a return type as object,  
    // but you can assign a method that returns a string.  
    Func<object> del = GetString;  
  
    // Contravariance. A delegate specifies a parameter type as string,  
    // but you can assign a method that takes an object.  
    Action<string> del2 = SetObject;  
}  

.NET Framework 4 이상 버전에서 C#은 제네릭 인터페이스 및 대리자의 공변성 및 반공변성(contravariance)을 지원하며 제네릭 형식 매개 변수의 암시적 변환을 허용합니다. 자세한 내용은 제네릭 인터페이스의 분산(C#)대리자 분산(C#)을 참조하세요.

다음 코드 예제에서는 제네릭 인터페이스에 대한 암시적 참조 변환을 보여 줍니다.

IEnumerable<String> strings = new List<String>();  
IEnumerable<Object> objects = strings;  

제네릭 매개 변수가 공변 또는 반공변으로 선언된 경우 제네릭 인터페이스 또는 대리자를 variant 라고 합니다. C#을 사용하면 고유한 변형 인터페이스 및 대리자를 만들 수 있습니다. 자세한 내용은 변형 제네릭 인터페이스 만들기(C#)대리자에서의 변이성(C#)을 참조하세요.

제목 설명
제네릭 인터페이스의 변조(C#) 제네릭 인터페이스의 공변성 및 반공변에 대해 설명하고 .NET의 변형 제네릭 인터페이스 목록을 제공합니다.
변변종 제네릭 인터페이스 생성(C#) 사용자 지정 변형 인터페이스를 만드는 방법을 보여 줍니다.
제네릭 컬렉션에 대한 인터페이스의 가변성 사용(C#) IEnumerable<T>IComparable<T> 인터페이스의 공변성과 반공변성 지원이 코드를 재사용하는 데 어떻게 도움이 되는지 보여 줍니다.
대리자의 변이(C#) 제네릭 및 비제네릭 대리자의 공변성과 반공변성에 대해 설명하고 .NET에서 가변 제네릭 대리자 목록을 제공합니다.
대리자에서 가변성 사용(C#) 제네릭이 아닌 대리자에서 공변성 및 반공변성 지원을 사용하여 메서드 시그니처를 대리자 형식과 일치시킬 수 있는 방법을 보여 줍니다.
Func 및 Action 제네릭 대리자에서 분산 사용하기 (C#) FuncAction 대리자의 공변성과 반공변성 지원이 코드 재사용에 어떻게 도움이 되는지를 보여줍니다.