C#: Должен вложенный класс в универсальном классе считаться универсальным?

возникает ошибка тайм-аута, когда экземпляр (в вашем случае производственный экземпляр) недоступен из GitLab (может быть размещен на ВМ, Kubernetes и т. Д.). Проверьте, можете ли вы выполнять telnet / ssh вручную с виртуальной машины, размещенной на GitLab

. Замените myIP правильными значениями и посмотрите, поможет ли это.

telnet <myIP> 22
ssh <myIP>
10
задан CodeMangler 28 January 2009 в 09:15
поделиться

4 ответа

Короче говоря, да - тип наследовал аргументы типа от любых типов, которые содержат его: это - ключ к вещам как List<T>.Enumerator и много других сценариев, и т.д. - очень важно, что они совместно используют T от внешнего класса (не просто любой T).

ECMA касательно является §25.1:

Любой класс, вложенный в универсальном объявлении класса или универсальном объявлении структуры (§25.2), является самостоятельно универсальным объявлением класса, так как параметры типа для содержания типа должны быть предоставлены для создания созданного типа.

19
ответ дан 3 December 2019 в 15:22
поделиться

Да, Ваш вложенный класс абсолютно универсален, потому что T связывается с типом (это известно как закрытый дженерик) в рамках любого экземпляра вложенного класса.

using System;
using System.Collections.Generic;

public class AGenericClass<T> {
    public class NestedNonGenericClass {
        public void DoSomething() {
            Console.WriteLine("typeof(T) == " + typeof(T));
        }
    }
}

public class MyClass {
    public static void Main()   {
        var c = new AGenericClass<int>.NestedNonGenericClass();
        var d = new AGenericClass<DateTime>.NestedNonGenericClass();
        c.DoSomething();
        d.DoSomething();
        Console.ReadKey(false); 
    }

}

То же DoSomething() метод производит другой вывод в зависимости от того, как универсальный тип был закрыт - так да, внутренний класс определенно показывает универсальное поведение.

6
ответ дан 3 December 2019 в 15:22
поделиться

Если Ваш не попытка использовать T в NestedNonGenericClass Вы могли бы просто поместить его вне класса и сделать его частным.. затем это не было бы Универсально....

2
ответ дан 3 December 2019 в 15:22
поделиться

Способ, которым я принимаю решение понять это, при использовании универсального типа C# генерирует все в том типе. Таким образом, действительно, если бы я должен был визуализировать то, что было бы сгенерировано, если бы я использовал AGenericClass и AGenericClass от Вашего примера выше, то Вы закончили бы с двумя копиями вложенного класса:

public class AGenericClass<int>
{
    public class NestedNonGenericClass
    {
    }
}

public class AGenericClass<float>
{
    public class NestedNonGenericClass
    {
    }
}

Из-за этого я считал бы вложенный класс универсальным классом, поскольку существует две версии его, один названный AGenericClass <интервал>.NestedNonGenericClass, и другой назвал AGenericClass <плавание>.NestedNonGenericClass. Таким образом, действительно это похоже на Вас, действительно явно указывал, что вложенный класс был дженериком также. Это поведение может быть очень полезным, при необходимости чтобы вложенный класс адаптировался к универсальному типу.

Однако я нашел это раздражающим, что я больше не могу использовать вложенные классы в том же способе, который я делаю на нормальных классах. Я не могу больше помнить точный пример, я сожалею, но я знаю, что, после того как должен был переместить класс из дженерика так, чтобы я мог использовать его, как предназначено от других мест в коде. Это шло вразрез с обычным шаблоном, который я использовал для вложенных классов и таким образом, мне не нравился он, но это был единственный путь. Таким образом, я могу понять, могли ли Вы не согласиться со способом, которым это сделано, но честно говоря, я думаю способ, которым он сделан, самый ясный путь. Я имею в виду, это очень ясно Вам и компилятору, что, если Вы перемещаете вложенный класс снаружи и просто имеете его как регулярный класс, что Вы не хотите, чтобы компилятор генерировал его как дженерик. Я не думаю, что они могли изменить к лучшему это.

2
ответ дан 3 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: