백엔드 개발 C#.Net 튜토리얼 C# 2.0 사양(제네릭 4)

C# 2.0 사양(제네릭 4)

Jan 03, 2017 am 10:35 AM

제네릭 3개에 연결

20.6 제네릭 메소드

제네릭 메소드는 특정 유형과 관련된 메소드입니다. 일반 매개변수 외에도 일반 메소드는 메소드를 사용할 때 제공해야 하는 유형 매개변수 세트의 이름도 지정합니다. 제네릭 메서드는 클래스, 구조체 또는 인터페이스 선언에서 선언될 수 있으며 그 자체가 제네릭이거나 제네릭이 아닐 수 있습니다. 제네릭 메서드가 제네릭 형식 선언에 선언된 경우 메서드 본문은 메서드의 형식 매개 변수를 참조하고 선언된 형식 매개 변수를 포함할 수 있습니다.

class-member-declaration:(类成员声明:)
…
generic-method-declaration (泛型方法声明)
struct-member-declaration:(结构成员声明:)
…
generic-method-declaration(泛型方法声明)
interface-member-declaration:(接口成员声明:)
…
interface-generic-method-declaration(接口泛型方法声明)
泛型方法的声明可通过在方法的名字之后放置类型参数列表而实现。
generic-method-declaration:(泛型方法声明:)
generic-method-header method-body(泛型方法头 方法体)
generic-method-header:(泛型方法头:)
로그인 후 복사

속성 opt 메소드-수정자 ​​opt 반환 유형 멤버 이름 유형-매개변수 목록 (형식-매개변수 목록 opt ​​) 유형-매개변수-제약 조건-절 opt
(속성 선택적 메소드 수정자 선택적 반환 유형 멤버 이름 유형 매개변수 목록(형식 매개변수 목록 선택적) 유형 매개변수 제약문 선택적)
interface-generic-method-declaration: (인터페이스 일반 메소드 선언:)
속성 opt 새로운 opt 반환 유형 식별자 type-parameter-list
(formal-parameter-list opt) type-parameter-constraints-clauses opt ;
(선택적 새 선택적 반환 유형 식별자 속성 유형 매개변수 목록 (공식 매개변수 목록 선택 사항) 유형 매개 변수 제약 조건 문은 선택 사항입니다.
유형 매개 변수 목록과 유형 매개 변수 제약 조건 문은 유형 매개 변수 목록에서 선언한 유형 매개 변수 범위와 동일한 구문과 기능을 가지며, 이를 사용하여 사용할 수 있습니다. 반환 값, 메서드 본문 및 형식 매개 변수 제약 조건을 포함하지만 속성은 포함하지 않습니다.

메서드의 형식 매개 변수 이름은 동일한 메서드의 일반 매개 변수 이름과 동일할 수 없습니다. 🎜>
다음 예제는 주어진 테스트 대리자를 충족하는 경우 배열의 첫 번째 요소를 찾습니다. 일반 대리자는 §20.4에 설명되어 있습니다. 다른 모든 수정자는 일반 메서드에서 유효합니다. 일반 메서드 시그니처

시그니처 비교를 위해 유형 매개변수의 이름과 마찬가지로 모든 유형 매개변수 제약 조건이 무시되지만 유형의 요소 위치와 마찬가지로 유형 매개변수의 수도 무시됩니다. 다음 예에서는 이 규칙의 효과를 보여줍니다. 아래의 메서드 서명은 일반 형식 선언(§20.1.8)에 사용되는 것과 유사한 규칙에 따라 적용됩니다. 동일한 이름과 동일한 개수의 형식 인수는 동일한 순서로 동일한 시그니처를 사용하여 두 개의 메서드를 생성하는 경우 형식 인수 목록을 포함하는 매개 변수 형식을 가질 수 없습니다(예: <). 🎜>

public delegate bool Test<T>(T item);
public class Finder
{
public static T Find<T>(T[] items , Test<T> test){
foreach(T item in items)
{
if(test(item)) return item;
}
throw new InvalidOperationException(“Item not found”);
}
}
로그인 후 복사


20.6.2 가상 제네릭 메서드

제네릭 메서드는 abstract, virtual 및 override 수식자를 사용하여 선언할 수 있습니다. 메서드 재정의 및 인터페이스 구현을 일치시킬 때 §20.6.1에 설명된 규칙과 일치하는 서명이 사용됩니다. 일반 메서드가 기본 클래스에 선언된 일반 메서드를 재정의하거나 기본 인터페이스에서 메서드를 구현하는 경우 각 유형 매개변수에 대해 지정된 제약 조건은 두 선언 모두에서 동일해야 합니다. 여기서 메서드 유형 매개변수는 다음과 같습니다. 원래 위치는 다음에서 식별됩니다. 왼쪽에서 오른쪽으로.

추상 클래스 Base



F를 다시 작성한 것은 유형 매개변수 이름이 다를 수 있으므로 정확합니다. 주어진 유형 매개변수 제약 조건(여기에는 제약 조건이 없음)이 재정의된 메서드와 일치하지 않기 때문에 G의 재정의는 잘못되었습니다.
class A{}
class B {}
interface IX
{
T F1<T>(T[] a , int i); //错误,因为返回类型和类型参数名字无关紧要,
void F1<U>(U[] a ,int i); //这两个声明都有相同的签名
void F2<T><int x>; //OK,类型参数的数量是签名的一部分
void F2(int x);
void F3<T>(T t) where T: A // 错误,约束不在签名考虑之列
void F3<T>(T t) where T:B: 
}
로그인 후 복사


20.6.3 일반 메서드 호출

泛型方法调用可以显式指定类型实参列表,或者省略类型实参列表,而依靠类型推断来确定类型实参。方法调用的确切编译时处理,包括泛型方法调用,在§20.9.5中进行了描述。当泛型方法不使用类型参数列表调用时,类型推断将按§20.6.4中所描述的进行。

下面的例子展示在类型推断和类型实参替代参数列表后,重载决策是如何发生的。

class Test
{
static void F<T>(int x , T y)
{
Console.WriteLine(“One”);
}
static void F<T>(T x , long y)
{
Console.WriteLine(“two”);
}
static void Main()
{
F<int>(5,324); //ok,打印“one”
F<byte>(5,324); //ok, 打印“two”
F<double>(5,324); //错误,模糊的
F(5,324); //ok,打印“one”
F(5,324L); //错误,模糊的 
}
}
로그인 후 복사

20.6.4类型实参推断

当不指定类型实参而调用泛型方法时,类型推断(type inference)处理将试图为调用推断类型实参。类型推断的存在可以让调用泛型方法时,采用更方便的语法,并且可以避免程序员指定冗余的类型信息。例如,给定方法声明

class Util
{
static Random rand = new Random();
static public T Choose<T>(T first , T second)
{
return (rand.Next(2) == 0)?first:second
}
}
로그인 후 복사

不显式指定类型实参而调用 Choose方法也是可以的。

int i = Util.Choose(5,123); //调用Choose<int>
string s = Util.Choose(“foo”,”bar”);//调用Choose<string>
로그인 후 복사

通过类型推断,类型实参int和string 将由方法的实参确定。

类型推断作为方法调用(§20.9.5)编译时处理的一部分而发生,并且在调用的重载决策之前发生。当在一个方法调用中指定特定的方法组时,类型实参不会作为方法调用的一部分而指定,类型推断将被应用到方法组中的每个泛型方法。如果类型推断成功,被推断的类型实参将被用于确定后续重载决策的实参类型。如果重载决策选择将要调用的泛型方法,被推断的类型实参将被用作调用的实际类型实参。如果特定方法类型推断失败,这个方法将不参与重载决策。类型推断失败自身将不会产生编译时错误。但当重载决策没能找到适用的方法时,将会导致编译时错误。

如果所提供的实参个数与方法的参数个数不同,推断将立刻失败。否则,类型推断将为提供给方法的每个正式实参独立地发生。假定这个实参的类型为A,对应参数为类型P。类型推断将按下列步骤关联类型A和P而。

如果以下任何一条成立,将不能从实参推断任何东西(但类型推断是成功的)

- P和方法的任何类型参数无关[1]
- 实参是null字符
- 实参是一个匿名方法
- 实参是一个方法组



如果P是一个数组类型,A是一个同秩(rank)的数组类型,那么使用A和P的元素类型相应地替换A和P,并重复这个步骤。

如果P是一个数组类型,而A 是一个不同秩的数组类型,那么泛型方法的类型推断失败。

如果P是方法的类型参数,那么对于这个实参的类型推断成功,并且A是那个类型实参所推断的类型。

否则,P必须是一个构造类型。如果对于出现在P中的每个方法类型参数MX ,恰好可以确定一个类型TX,使用每个TX替换每个MX ,这将产生一个类型,对于这个类型,A可以通过标准的隐式转换而被转换,那么对于这个实参的类型推断成功,对于每个MX,TX 就是推断的类型。方法类型参数约束(如果有的话),因为类型推断的原因将会被忽略。如果对于一个给定的MX 没有TX存在或者多于一个TX存在 ,那么泛型方法的类型推断将会失败(多于一个TX 存在的情形只可能发生在,P是一个泛型接口类型,并且A实现了接口的多个构造版本)。

如果所有的方法实参都通过先前的算法进行了处理,那么从实参而来的所有推断都将被汇聚。这组推断必须有如下的属性。

方法的每个类型参数必须有一个为其推断的类型实参。简而言之,这组推断必须是完整的([/b]complete[/b])[/b];

如果类型参数出现多于一次,那么对那个类型参数的所有的推断都必须推断相同的类型实参。简而言之,这组接口必须是一致的([/b]consistent[/b])[/b]。


如果能够找到一组完整而一致的推断类型实参,那么对于一个给定的泛型方法和实参列表,类型推断就可以说是成功的。

如果泛型方法使用参数数组(§10.5.1.4)声明,那么类型推断针对方法将以其通常的方式执行。如果类型推断成功,结果方法是可用的,那么方法将以其通常形式对于重载决策是可行的。否则,类型推断将针对方法的扩展形式(§7.4.2.1)执行。

[1]也就是P并不是方法的类型参数列表所列类型之一。

以上就是C# 2.0 Specification (泛型四)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C# .NET 인터뷰 질문 및 답변 : 전문 지식 레벨 업 C# .NET 인터뷰 질문 및 답변 : 전문 지식 레벨 업 Apr 07, 2025 am 12:01 AM

C#.NET 인터뷰 질문 및 답변에는 기본 지식, 핵심 개념 및 고급 사용이 포함됩니다. 1) 기본 지식 : C#은 Microsoft가 개발 한 객체 지향 언어이며 주로 .NET 프레임 워크에 사용됩니다. 2) 핵심 개념 : 위임 및 이벤트는 동적 바인딩 방법을 허용하고 LINQ는 강력한 쿼리 기능을 제공합니다. 3) 고급 사용 : 비동기 프로그래밍은 응답 성을 향상시키고 표현 트리는 동적 코드 구성에 사용됩니다.

C# .NET : 핵심 개념 탐색 및 프로그래밍 기초 C# .NET : 핵심 개념 탐색 및 프로그래밍 기초 Apr 10, 2025 am 09:32 AM

C#은 Microsoft가 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET 프레임 워크의 일부로 개발되었습니다. 1.C#은 캡슐화, 상속 및 다형성을 포함한 객체 지향 프로그래밍 (OOP)을 지원합니다. 2. C#의 비동기 프로그래밍은 응용 프로그램 응답 성을 향상시키기 위해 비동기 및 키워드를 기다리는 키워드를 통해 구현됩니다. 3. LINQ를 사용하여 데이터 컬렉션을 간결하게 처리하십시오. 4. 일반적인 오류에는 NULL 참조 예외 및 인덱스 외 예외가 포함됩니다. 디버깅 기술에는 디버거 사용 및 예외 처리가 포함됩니다. 5. 성능 최적화에는 StringBuilder 사용 및 불필요한 포장 및 Unboxing을 피하는 것이 포함됩니다.

C# .NET 응용 프로그램 테스트 : 장치, 통합 및 엔드 투 엔드 테스트 C# .NET 응용 프로그램 테스트 : 장치, 통합 및 엔드 투 엔드 테스트 Apr 09, 2025 am 12:04 AM

C#.NET 애플리케이션에 대한 테스트 전략에는 단위 테스트, 통합 테스트 및 엔드 투 엔드 테스트가 포함됩니다. 1. 단위 테스트를 통해 MSTEST, NUNIT 또는 XUNIT 프레임 워크를 사용하여 코드의 최소 단위가 독립적으로 작동합니다. 2. 통합 테스트는 일반적으로 사용되는 시뮬레이션 된 데이터 및 외부 서비스를 결합한 여러 장치의 기능을 확인합니다. 3. 엔드 투 엔드 테스트는 사용자의 완전한 작동 프로세스를 시뮬레이션하며 셀레늄은 일반적으로 자동 테스트에 사용됩니다.

C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오. C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오. Apr 16, 2025 am 12:07 AM

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.

웹에서 데스크톱으로 : C# .NET의 다양성 웹에서 데스크톱으로 : C# .NET의 다양성 Apr 15, 2025 am 12:07 AM

C#.NETISVERSATILEFORBOTHWEBBANDDESKTOPDEVENTROMMENT.1) FORWEB, useASP.NETFORRICHINTERFACES.3) FORDESKTOP.3) USEXAMARINFORCROSS-PLATFORMDEEVENTRIMMENT, LINABILEDEV, MACODEDEV, and MACODEDOWS, 및 MACODEDOWS.

Advanced C# .NET 튜토리얼 : ACE 귀하의 다음 선임 개발자 인터뷰 Advanced C# .NET 튜토리얼 : ACE 귀하의 다음 선임 개발자 인터뷰 Apr 08, 2025 am 12:06 AM

C# 수석 개발자와의 인터뷰에는 비동기 프로그래밍, LINQ 및 .NET 프레임 워크의 내부 작업 원리와 같은 핵심 지식을 마스터하는 것이 필요합니다. 1. 비동기 프로그래밍은 비동기를 통해 작업을 단순화하고 응용 프로그램 응답 성을 향상시키기 위해 기다리고 있습니다. 2.linq는 SQL 스타일로 데이터를 운영하고 성능에주의를 기울입니다. 3. Net Framework의 CLR은 메모리를 관리하며 가비지 컬렉션은주의해서 사용해야합니다.

c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다 c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다 Apr 13, 2025 am 12:03 AM

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

다양한 .NET 언어로서 C# : 응용 프로그램 및 예제 다양한 .NET 언어로서 C# : 응용 프로그램 및 예제 Apr 26, 2025 am 12:26 AM

C#은 엔터프라이즈 레벨 애플리케이션, 게임 개발, 모바일 응용 프로그램 및 웹 개발에서 널리 사용됩니다. 1) 엔터프라이즈 레벨 애플리케이션에서 C#은 종종 asp.netcore가 webapi를 개발하는 데 사용됩니다. 2) 게임 개발에서 C#은 Unity 엔진과 결합되어 역할 제어 및 기타 기능을 실현합니다. 3) C#은 코드 유연성 및 응용 프로그램 성능을 향상시키기 위해 다형성 및 비동기 프로그래밍을 지원합니다.

See all articles