Записи 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 - это запись?

0 ответов

Другие вопросы по тегам