Heim Backend-Entwicklung C#.Net-Tutorial C# 2.0-Spezifikation (Generics 4)

C# 2.0-Spezifikation (Generics 4)

Jan 03, 2017 am 10:35 AM

Verbunden mit Generic Three

20.6 Generische Methoden

Generische Methoden sind Methoden, die sich auf einen bestimmten Typ beziehen. Zusätzlich zu den regulären Parametern benennt eine generische Methode auch eine Reihe von Typparametern, die bei Verwendung der Methode angegeben werden müssen. Generische Methoden können in einer Klassen-, Struktur- oder Schnittstellendeklaration deklariert werden und selbst generisch oder nicht generisch sein. Wenn eine generische Methode in einer generischen Typdeklaration deklariert wird, kann der Methodenkörper auf die Typparameter der Methode verweisen und die deklarierten Typparameter enthalten.

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:(泛型方法头:)
Nach dem Login kopieren

Attribute opt Methodenmodifikatoren opt Rückgabetyp Mitgliedsname Typparameterliste (formelle Parameterliste opt) Typparameter-Einschränkungenklausel opt
(Attribut optionaler Methodenmodifikator optionaler Rückgabetyp, Mitgliedsname, Typparameterliste (formale Parameterliste optional), Typparameter-Einschränkungsanweisung optional)
interface-generic-method-declaration: (Deklaration der generischen Schnittstellenmethode:)
Attribute opt new opt Return-Type Identifier type-parameter-list
(formal-parameter-list opt) type-parameter-constraints-clauses opt ;
(attributes optional new optional return type Identifier Typparameterliste (formale Parameterliste ist optional) Die Typparameter-Einschränkungsanweisung ist optional.
Typparameterliste und Typparameter-Einschränkungsanweisung haben dieselbe Syntax und Funktion wie der durch die Typparameterliste deklarierte Typparameterbereich Formularanweisungen einschließlich Rückgabewerten, Methodenkörpern und Typparametereinschränkungen, aber nicht Attributen. Die Namen der Typparameter einer Methode dürfen nicht mit den Namen der regulären Parameter derselben Methode identisch sein 🎜>
Das folgende Beispiel findet das erste Element in einem Array, wenn es den angegebenen Testdelegaten erfüllt. Generische Methoden können nicht als extern deklariert werden Generische Methodensignaturen

Für Signaturvergleichszwecke werden alle Typparametereinschränkungen ignoriert, ebenso wie der Name des Typparameters, aber auch die Anzahl der Typparameter wird ignoriert, ebenso wie die Elementposition des Typs Parameter von links nach rechts. Die folgende Methodensignatur unterliegt einer ähnlichen Regel wie bei generischen Typdeklarationen (§20.1.8). Es gelten zwei generische Methodendeklarationen Derselbe Name und die gleiche Anzahl von Typargumenten können keine Parametertypen haben, die die Liste der Typargumente einschließen, wenn sie zwei Methoden mit derselben Signatur in derselben Reihenfolge erzeugen, wenn sie beispielsweise auf zwei Methoden in derselben Reihenfolge angewendet werden 🎜>

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”);
}
}
Nach dem Login kopieren
20.6.2 Virtuelle generische Methode


Generische Methoden können mit abstrakten, virtuellen und Override-Modifikatoren deklariert werden. Beim Abgleich von Methodenüberschreibungen und Schnittstellenimplementierungen werden Signaturen verwendet, die den in §20.6.1 beschriebenen Regeln entsprechen. Wenn eine generische Methode eine in einer Basisklasse deklarierte generische Methode überschreibt oder eine Methode in einer Basisschnittstelle implementiert, müssen die für jeden Typparameter angegebenen Einschränkungen in beiden Deklarationen gleich sein, wobei die Parameter des Methodentyps anhand der ursprünglichen Positionen identifiziert werden von links nach rechts. Das Umschreiben von

abstract class Base


F ist korrekt, da die Typparameternamen unterschiedlich sein dürfen. Das Überschreiben von G ist falsch, da die angegebenen Typparametereinschränkungen (hier gibt es keine Einschränkungen) nicht mit der überschriebenen Methode übereinstimmen.

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: 
}
Nach dem Login kopieren
20.6.3 Aufruf generischer Methoden

泛型方法调用可以显式指定类型实参列表,或者省略类型实参列表,而依靠类型推断来确定类型实参。方法调用的确切编译时处理,包括泛型方法调用,在§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); //错误,模糊的 
}
}
Nach dem Login kopieren

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
}
}
Nach dem Login kopieren

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

int i = Util.Choose(5,123); //调用Choose<int>
string s = Util.Choose(“foo”,”bar”);//调用Choose<string>
Nach dem Login kopieren

通过类型推断,类型实参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)!


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1662
14
PHP-Tutorial
1261
29
C#-Tutorial
1234
24
C# .NET -Interview Fragen und Antworten: Stufen Sie Ihr Fachwissen auf C# .NET -Interview Fragen und Antworten: Stufen Sie Ihr Fachwissen auf Apr 07, 2025 am 12:01 AM

C#.NET -Interviewfragen und Antworten umfassen Grundkenntnisse, Kernkonzepte und erweiterte Nutzung. 1) Grundkenntnisse: C# ist eine von Microsoft entwickelte objektorientierte Sprache und wird hauptsächlich im .NET-Framework verwendet. 2) Kernkonzepte: Delegation und Ereignisse ermöglichen dynamische Bindungsmethoden, und LINQ bietet leistungsstarke Abfragefunktionen. 3) Erweiterte Verwendung: Asynchrone Programmierung verbessert die Reaktionsfähigkeit und Expressionsbäume werden für die dynamische Codekonstruktion verwendet.

C# .NET: Erforschen von Kernkonzepten und Programmierfundamentaldaten C# .NET: Erforschen von Kernkonzepten und Programmierfundamentaldaten Apr 10, 2025 am 09:32 AM

C# ist eine moderne, objektorientierte Programmiersprache, die von Microsoft und als Teil des .NET-Frameworks entwickelt wurde. 1.C# unterstützt die objektorientierte Programmierung (OOP), einschließlich Einkapselung, Vererbung und Polymorphismus. 2. Asynchrones Programmieren in C# wird über Async implementiert und wartet auf Schlüsselwörter, um die Reaktionsfähigkeit der Anwendungen zu verbessern. 3.. Verwenden Sie LINQ, um Datensammlungen präzise zu verarbeiten. 4. Häufige Fehler umfassen Null-Referenzausnahmen und Indexausnahmen außerhalb des Bereichs. Zu den Debugging -Fähigkeiten gehört die Verwendung eines Debuggers und Ausnahmeberechnung. 5. Leistungsoptimierung umfasst die Verwendung von StringBuilder und das Vermeiden von unnötigem Packung und Unboxing.

Testen von C# .NET-Anwendungen: Einheit, Integration und End-to-End-Test Testen von C# .NET-Anwendungen: Einheit, Integration und End-to-End-Test Apr 09, 2025 am 12:04 AM

Die Teststrategien für C#.NET-Anwendungen umfassen Unit-Tests, Integrationstests und End-to-End-Tests. 1. Unit -Test stellt sicher, dass die Mindesteinheit des Codes unter Verwendung des Frameworks MStest, Nunit oder Xunit unabhängig funktioniert. 2. Integrierte Tests überprüfen die Funktionen mehrerer Einheiten kombinierter, häufig verwendeten simulierten Daten und externen Diensten. 3. End-to-End-Tests simuliert den vollständigen Betriebsprozess des Benutzers, und Selen wird normalerweise für automatisierte Tests verwendet.

Die anhaltende Relevanz von C# .NET: Ein Blick auf die aktuelle Verwendung Die anhaltende Relevanz von C# .NET: Ein Blick auf die aktuelle Verwendung Apr 16, 2025 am 12:07 AM

C#.NET ist immer noch wichtig, da es leistungsstarke Tools und Bibliotheken bietet, die mehrere Anwendungsentwicklung unterstützen. 1) C# kombiniert .NET Framework, um die Entwicklung effizient und bequem zu machen. 2) Mechanismus zum Typensicherheit und Müllsammlung von C#erhöht die Vorteile. 3) .NET bietet eine plattformübergreifende laufende Umgebung und eine reichhaltige APIs, wodurch die Flexibilität der Entwicklung verbessert wird.

Vom Web zum Desktop: Die Vielseitigkeit von C# .NET Vom Web zum Desktop: Die Vielseitigkeit von C# .NET Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

Advanced C# .NET Tutorial: Ace Ihr nächstes Senior Developer Interview Advanced C# .NET Tutorial: Ace Ihr nächstes Senior Developer Interview Apr 08, 2025 am 12:06 AM

Das Interview mit C# Senior Developer erfordert das Mastering von Kernwissen wie asynchrones Programmieren, LINQ und interne Arbeitsprinzipien von .NET -Frameworks. 1. Asynchrones Programmieren vereinfacht die Operationen durch Async und wartet auf die Verbesserung der Anwendungsreaktionsfähigkeit. 2.LinQ betreibt Daten im SQL -Stil und achtet auf die Leistung. 3. Die CLR des Net -Frameworks verwaltet den Speicher, und die Müllsammlung muss mit Vorsicht verwendet werden.

Ist C# .NET das Richtige für Sie? Bewertung seiner Anwendbarkeit Ist C# .NET das Richtige für Sie? Bewertung seiner Anwendbarkeit Apr 13, 2025 am 12:03 AM

C#.NetissoBableFoREenterPrise-Level Applications-WithemicrosoftCosystemDuetoitsStrongtyPing, Richlibrary, Androbustperformance.

C# als vielseitige .NET -Sprache: Anwendungen und Beispiele C# als vielseitige .NET -Sprache: Anwendungen und Beispiele Apr 26, 2025 am 12:26 AM

C# wird häufig in Anwendungen auf Unternehmensebene, Spieleentwicklung, mobilen Anwendungen und Webentwicklung verwendet. 1) In Anwendungen auf Unternehmensebene wird C# häufig für ASP.NetCore zur Entwicklung von WebAPI verwendet. 2) In der Spielentwicklung wird C# mit der Unity Engine kombiniert, um die Rollenkontrolle und andere Funktionen zu realisieren. 3) C# unterstützt Polymorphismus und asynchrone Programmierung, um die Code -Flexibilität und die Anwendungsleistung zu verbessern.

See all articles