Подтвердить что ты не робот

С# Язык: общие, открытые/закрытые, связанные/несвязанные, построенные

Я читаю книгу "Язык программирования С#", 4-е издание, Андерс Хейлсберг и т.д.

Существует несколько определений, которые немного скручиваются:

несвязанный общий тип: объявление общего типа само по себе обозначает несвязанный общий тип...

построенный тип. Тип, который включает по крайней мере один аргумент типа, называется построенным типом.

открытый тип. Открытый тип - это тип, который включает параметры типа.

закрытый тип. Закрытый тип - это тип, который не является открытым.

несвязанный тип: относится к неродному типу или несвязаному родовому типу.

связанный тип: относится к неродному типу или построенному типу. [аннотировать] ERIC LIPPERT: Да, неродственные типы считаются связанными и несвязанными.

Вопрос 1, ниже того, что я указал правильно?

int                     //non-generic, closed, unbound & bound, 
class A<T, U, V>        //generic,     open,   unbound, 
class A<int, U, V>      //generic,     open,   bound, constructed 
class A<int, int, V>    //generic,     open,   bound, constructed
class A<int, int, int>  //generic,     closed, bound, constructed

Вопрос 2. В книгах говорится: "Несвязанный тип относится к объекту, объявленному объявлением типа. Несвязанный общий тип сам по себе не является типом и не может использоваться как тип переменной, аргумент или возвращаемое значение или как базовый тип. Единственной конструкцией, в которой может ссылаться несвязанный общий тип, является тип выражения (§7.6.11) ". Хорошо, но ниже - небольшая программа тестирования, которая может скомпилировать:

public class A<W, X> { }

// Q2.1: how come unbounded generic type A<W,X> can be used as a base type?
public class B<W, X> : A<W, X> { } 

public class C<T,U,V>
{
    // Q2.2: how come unbounded generic type Dictionary<T, U> can be used as a return value?
    public Dictionary<T,U> ReturnDictionary() { return new Dictionary<T, U>(); }

    // Q2.3: how come unbounded generic type A<T, U> can be used as a return value?
    public A<T, U> ReturnB() { return new A<T, U>(); }
}
4b9b3361

Ответ 1

Это примеры несвязанных общих типов:

  • List<>
  • Dictionary<,>

Их можно использовать с typeof, т.е. следующие допустимые выражения:

  • typeof(List<>)
  • typeof(Dictionary<,>)

Это должно ответить на ваш вопрос 2. Что касается вопроса 1, обратите внимание, что аргументы типа могут быть построены типами или параметрами типа. Таким образом, ваш список должен быть обновлен следующим образом:

public class MyClass<T, U> {  // declares the type parameters T and U

    // all of these are
    // - generic,
    // - constructed (since two type arguments are supplied), and
    // - bound (since they are constructed):

    private Dictionary<T, U> var1;     // open (since T and U are type parameters)
    private Dictionary<T, int> var2;   // open (since T is a type parameter)
    private Dictionary<int, int> var3; // closed
}

Ответ 2

Отличный ответ дает Джон, здесь.

Не дает технического описания, поскольку в ответном соединении все отлично. Чтобы просто воспроизвести суть этого в качестве ответа здесь, это будет выглядеть так:

A                             //non generic, bound
A<U, V>                       //generic,     bound,  open,   constructed
A<int, V>                     //generic,     bound,  open,   constructed
A<int, int>                   //generic,     bound,  closed, constructed
A<,> (used like typeof(A<,>)) //generic,     unbound 

Отредактировано после обсуждения с Хайнци.