возникает ошибка тайм-аута, когда экземпляр (в вашем случае производственный экземпляр) недоступен из GitLab (может быть размещен на ВМ, Kubernetes и т. Д.). Проверьте, можете ли вы выполнять telnet / ssh вручную с виртуальной машины, размещенной на GitLab
. Замените myIP правильными значениями и посмотрите, поможет ли это.
telnet <myIP> 22
ssh <myIP>
Короче говоря, да - тип наследовал аргументы типа от любых типов, которые содержат его: это - ключ к вещам как List<T>.Enumerator
и много других сценариев, и т.д. - очень важно, что они совместно используют T
от внешнего класса (не просто любой T
).
ECMA касательно является §25.1:
Любой класс, вложенный в универсальном объявлении класса или универсальном объявлении структуры (§25.2), является самостоятельно универсальным объявлением класса, так как параметры типа для содержания типа должны быть предоставлены для создания созданного типа.
Да, Ваш вложенный класс абсолютно универсален, потому что 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()
метод производит другой вывод в зависимости от того, как универсальный тип был закрыт - так да, внутренний класс определенно показывает универсальное поведение.
Если Ваш не попытка использовать T в NestedNonGenericClass Вы могли бы просто поместить его вне класса и сделать его частным.. затем это не было бы Универсально....
Способ, которым я принимаю решение понять это, при использовании универсального типа C# генерирует все в том типе. Таким образом, действительно, если бы я должен был визуализировать то, что было бы сгенерировано, если бы я использовал AGenericClass и AGenericClass от Вашего примера выше, то Вы закончили бы с двумя копиями вложенного класса:
public class AGenericClass<int>
{
public class NestedNonGenericClass
{
}
}
public class AGenericClass<float>
{
public class NestedNonGenericClass
{
}
}
Из-за этого я считал бы вложенный класс универсальным классом, поскольку существует две версии его, один названный AGenericClass <интервал>.NestedNonGenericClass, и другой назвал AGenericClass <плавание>.NestedNonGenericClass. Таким образом, действительно это похоже на Вас, действительно явно указывал, что вложенный класс был дженериком также. Это поведение может быть очень полезным, при необходимости чтобы вложенный класс адаптировался к универсальному типу.
Однако я нашел это раздражающим, что я больше не могу использовать вложенные классы в том же способе, который я делаю на нормальных классах. Я не могу больше помнить точный пример, я сожалею, но я знаю, что, после того как должен был переместить класс из дженерика так, чтобы я мог использовать его, как предназначено от других мест в коде. Это шло вразрез с обычным шаблоном, который я использовал для вложенных классов и таким образом, мне не нравился он, но это был единственный путь. Таким образом, я могу понять, могли ли Вы не согласиться со способом, которым это сделано, но честно говоря, я думаю способ, которым он сделан, самый ясный путь. Я имею в виду, это очень ясно Вам и компилятору, что, если Вы перемещаете вложенный класс снаружи и просто имеете его как регулярный класс, что Вы не хотите, чтобы компилятор генерировал его как дженерик. Я не думаю, что они могли изменить к лучшему это.