Пожалуйста, посмотрите на этот код:
namespace ConsoleApp
{
public struct MyPoorGenericStructThatCannotBeUnmanaged<T> where T: unmanaged
{
public T Field;
}
public class MyClass<T> where T: unmanaged
{
}
class Program
{
static void Main()
{
// The type 'MyPoorGenericStructThatCannotBeUnmanaged<int>' must be a non-nullable value type,
// along with all fields at any level of nesting,
// in order to use it as parameter 'T' in the generic type or method 'MyClass<T>'
var obj = new MyClass<MyPoorGenericStructThatCannotBeUnmanaged<int>>();
}
}
}
Не удается скомпилировать с ошибкой:
Тип 'MyPoorGenericStructThatCannotBeUnmanaged' должен быть ненулевым типом значения, наряду свсе поля на любом уровне вложенности, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'MyClass'
Однако MyPoorGenericStructThatCannotBeUnmanaged<int>
является типом значения, не допускающим значения NULL, и всеего поля при любом значении вложенности действительно являются необнуляемыми типами значений.Это обеспечивается общим ограничением типа where T: unmanaged
Почему?