Записи C# 9: как указать универсальный тип T, который должен быть записью
Я экспериментирую с C# 9 RC, конвертируя существующее приложение для использования нового record
построить и связать with
ключевое слово.
Большая часть определенных мной типов записей реализуют этот интерфейс (измененный для использования init
ключевое слово вместо set
):
public interface IHasModifiedDate
{
DateTime ModifiedDate {get; init;}
}
(Примечание: конкретные классы, реализующие этот интерфейс, не имеют - и не могут - иметь общий суперкласс).
Я пытаюсь обновить общую вспомогательную функцию, которая позволяет обновлять измененную дату (где "обновлено" теперь означает: создать новый экземпляр только с этим изменением поля, используяwith
) то есть:
public static T UpdateModifiedDate<T>(T obj, DateTime whenTo) where T: IHasModifiedDate
{
return obj with {ModifiedDate = whenTo};
}
Это дает (разумную) ошибку компиляции: тип получателя 'T' не является допустимым типом записи, и, следовательно,with
ключевое слово нельзя использовать.
Я хотел бы иметь возможность добавить ограничение на T, указав, что T на самом деле является record
(точно так же, как вы можете указать, что T должен быть классом), например:
public static T UpdateModifiedDate<T>(T obj, DateTime whenTo) where T: record, IHasModifiedDate
{
return obj with {ModifiedDate = when};
}
но record
ключевое слово не распознается в этом контексте.
Есть ли другой способ указать, что T - это запись?