Переменные типа интерфейса всегда будут иметь неизменяемую семантику, изменяемую ссылочную семантику или семантику «странного» (что-то отличное от обычной ссылочной семантики или семантики значений).Если variable1
и variable2
оба объявлены как один и тот же тип интерфейса, один выполняет variable2 = variable1
, и никогда больше не записывает ни в одну из переменных, экземпляр, на который указывает variable1
, всегда будет неотличим от экземпляра, на который указываютvariable2
(поскольку это будет тот же экземпляр).
Универсальные типы с интерфейсными ограничениями могут иметь неизменяемую семантику, изменяемую ссылочную семантику или "причудливую" семантику, но также могут иметь семантику изменяемых значений.Это может быть опасно, если интерфейс не задокументирован как имеющий изменяемую семантику значений.К сожалению, нет никакого способа ограничить интерфейс иметь либо неизменяемую семантику, либо семантику изменяемого значения (это означает, что после variable2 = variable1
не должно быть возможности изменить variable1
, написав variable2
, и наоборот).Можно добавить ограничение "struct" вместе с ограничением интерфейса, но это исключит классы, которые имеют неизменную семантику, не исключая структуры, которые имеют ссылочную семантику.