Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚

where Π’ : class

Π’ этой Ρ„ΠΎΡ€ΠΌΠ΅ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ where ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово class ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π’ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ссылочного Ρ‚ΠΈΠΏΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, всякая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ значСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ int ΠΈΠ»ΠΈ bool, вмСсто Π“ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Π²ΠΎ врСмя компиляции.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° ограничСния Ρ‚ΠΈΠΏΠ° значСния.

where Π’ : struct

Π’ этой Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово struct ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π“ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° значСния. (Напомним, Ρ‡Ρ‚ΠΎ структуры относятся ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.) Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, всякая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылочный Ρ‚ΠΈΠΏ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ string, вмСсто Π“ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Π²ΠΎ врСмя компиляции. Но Ссли ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Ρ‚ΠΎ Π² любом случаС class ΠΈΠ»ΠΈ struct Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠΎ порядку Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ограничСния ссылочного Ρ‚ΠΈΠΏΠ°.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ограничСния ссылочного Ρ‚ΠΈΠΏΠ°.

using System;

class MyClass {

//...

}

// ΠΠ°Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ссылочного Ρ‚ΠΈΠΏΠ°, class Test<T> where Π’ : class {

Π’ obj;

public Test () {

// Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ допустим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ // Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π’ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ относится ΠΊ ссылочному // Ρ‚ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, obj = null;

}

// ...

}

class ClassConstraintDemo { static void Main() {

// Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π²ΠΏΠΎΠ»Π½Π΅ допустим, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ MyClass являСтся классом. Test<MyClass> Ρ… = new Test<MyClass>();

// Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΠ΄Π° содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // int относится ΠΊ Ρ‚ΠΈΠΏΡƒ значСния.

// Test<int> Ρƒ = new Test<int>();

}

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС класса Test, class Test<T> where T : class {

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ class Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ любой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π’ Π±Ρ‹Π» ссылочного Ρ‚ΠΈΠΏΠ°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания Π² конструкторС класса Test.

public Test () {

// Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ допустим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ // Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π’ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ относится ΠΊ ссылочному // Ρ‚ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, obj = null;

}

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj Ρ‚ΠΈΠΏΠ° Π’ присваиваСтся пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΎΠ΅ присваиваниС допустимо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ссылочных Ρ‚ΠΈΠΏΠΎΠ². Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° значСния. (Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π° являСтся обнуляСмый Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ структуры, ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ значСния ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (null). ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом β€” Π² Π³Π»Π°Π²Π΅ 20.) Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² отсутствиС ограничСния Ρ‚Π°ΠΊΠΎΠ΅ присваиваниС Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСдопустимым, ΠΈ ΠΊΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Π» Π±Ρ‹ компиляции. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° для ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° значСния являСтся Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ограничСния ссылочного Ρ‚ΠΈΠΏΠ°. Оно просто Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ любой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° значСния, Π² Ρ‚ΠΎΠΌ числС struct ΠΈ enum. (Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС обнуляСмый Ρ‚ΠΈΠΏ Π½Π΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ значСния.) НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ налоТСния ограничСния Ρ‚ΠΈΠΏΠ° значСния.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ограничСния Ρ‚ΠΈΠΏΠ° значСния.

using System;

struct MyStruct {

//...

}

class MyClass {

// ...

}

class Test<T> where T : struct {

T obj;

public Test(T x) { obj = x;

}

// ...

}

class ValueConstraintDemo { static void Main() {

// Оба ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… объявлСния Π²ΠΏΠΎΠ»Π½Π΅ допустимы.

Test<MyStruct> Ρ… = new Test<MyStruct>(new MyStruct ());

Test<int> Ρƒ = new Test<int>(10);

//А ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС нСдопустимо!

// Test<MyClass> z = new Test<MyClass>(new MyClass());

}

}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° класс Test ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

class Test<T> where Π’ : struct {

На ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Π’ Π² классС Test накладываСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ struct, ΠΈ поэтому ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ привязаны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° значСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ объявлСния Test<MyStruct>,n Test<int> Π²ΠΏΠΎΠ»Π½Π΅ допустимы, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ объявлСниС Test<MyClass> нСдопустимо. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом, ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ символы коммСнтария Π² Π½Π°Ρ‡Π°Π»Π΅ послСднСй строки ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС Π²ΠΎ врСмя компиляции.

УстановлСниС связи ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ограничСния

БущСствуСт Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ ограничСния Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ°. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса.

class Gen<T/ V> where V : T {

Π’ этом объявлСнии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ where увСдомляСт компилятор ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ°, привязанный ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° V, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ°, привязанный ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° Π’, ΠΈΠ»ΠΈ ΠΆΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Если подобная связь отсутствуСт ΠΏΡ€ΠΈ объявлСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Gen, Ρ‚ΠΎ Π²ΠΎ врСмя компиляции Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка. Π’Π°ΠΊΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° называСтся Π½Π΅ΠΏΡ€ΠΈΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ°. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ дСмонстрируСтся Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ этого ограничСния.

// Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ°.

using System;

class А {

//...

}

class Π’ : А {

// ...

}

// Π—Π΄Π΅ΡΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° V Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° Π’. class Gen<T, V> where V : T {

// ...

}

class NakedConstraintDemo { static void Main() {

// Π­Ρ‚ΠΎ объявлСниС Π²ΠΏΠΎΠ»Π½Π΅ допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ

// класс Π’ наслСдуСт ΠΎΡ‚ класса А.

GerKA, Π’> Ρ… = new Gen<A, Π’> () ;

// А это объявлСниС нСдопустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // класс А-.Π½Π΅ наслСдуСт ΠΎΡ‚ класса Π’. .

// Gen<B, А> Ρƒ = new Gen<B, А>();

}

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс Π’ наслСдуСт ΠΎΡ‚ класса А. ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π»Π΅Π΅ ΠΎΠ±Π° объявлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Gen Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main (). Как слСдуСт ΠΈΠ· коммСнтария ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ объявлСнию

Gen<A, Π’> Ρ… = new Gen<A, Π’> ();

ΠΎΠ½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс Π’ наслСдуСт ΠΎΡ‚ класса А. Но Π²Ρ‚ΠΎΡ€ΠΎΠ΅ объявлСниС

// Gen<B, А> Ρƒ = new Gen<B, А>();

нСдопустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс А Π½Π΅ наслСдуСт ΠΎΡ‚ класса Π’.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ

Π‘ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Π’ этом случаС ограничСния ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ списком Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ. Π’ этом спискС ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ class Π»ΠΈΠ±ΠΎ struct, Ссли ΠΎΠ½ΠΎ присутствуСт, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Ссли ΠΎΠ½ΠΎ накладываСтся. Π£ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ограничСния class ΠΈΠ»ΠΈ struct ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс rte Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ. Π”Π°Π»Π΅Π΅ ΠΏΠΎ списку Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° интСрфСйс, Π° послСдним ΠΏΠΎ порядку β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ new (). НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС считаСтся Π²ΠΏΠΎΠ»Π½Π΅ допустимым.

class Gen<T> where Π’ : MyClass, IMylnterface, new() {

// ...

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Π’ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ°, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΡ‚ класса MyClass, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ интСрфСйс IMylnterface ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ конструктор Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Если ΠΆΠ΅ Π² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ ограничСния Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° where, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where, using System;

// Π£ класса Gen ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, ΠΈ Π½Π° ΠΎΠ±Π° Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ // ограничСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where, class Gen<T, V> where T : class

where V : struct {

T obi;

V ob2;

public Gen(T t, V v) { obi = t;

ob2 = v;

}

}

class MultipleConstraintDemo { static void Main() {

// Π­Ρ‚Π° строка ΠΊΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ допустима, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // string β€” это ссылочный Ρ‚ΠΈΠΏ, a int β€” Ρ‚ΠΈΠΏ значСния.

Gen<string, int> obj = new Gen<string, int>(nTecTM, 11);

//А ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΠ΄Π° нСдопустима, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // bool Π½Π΅ относится ΠΊ ссылочному Ρ‚ΠΈΠΏΡƒ.

// Gencbool, int> obj = new Gencbool, int>(true, 11);

}

}

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класс Gen ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с ограничСниями, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° объявлСниС этого класса.

class GenCT, V> where T : class