Довольно поздно, но я думаю, что это стоит знать ..
Вы можете принудительно использовать конструкторы с 0 параметрами для неабстрактных классов.Это ограничение типа, которое нужно использовать всякий раз, когда вы хотите применить эти ограничения к структуре класса.Требуется указать тип, который реализует интерфейс, который может быть смущен.Это цена, если вы хотите аккуратный тип безопасности.
public interface IEmptyConstructor<TThis> where TThis : IEmptyConstructor<TThis>, new() {}
например, одноэлементная структура
public abstract class Singleton<TThis> : ISingleton where TThis : Singleton<TThis>, new() { /* some singleton madness */ }