|
|
От: |
VladD2
|
www.nemerle.org |
| Дата: | 23.05.25 13:58 | ||
| Оценка: | |||
class A {}
class B : A {}
class C : B {}
Foo(List<A> list);
var list = [new B()]; // тип с ограничением элемента E <= B (где переменная типа элемента). Тип списка L<E> >= IEnumerable<E >= B>
list.Add(new C()); // Проверить у него наличие Add() мы пока не можем. Но кода это удастся, тип списка будет по прежнему ограничен: IEnumerable<E >= B>, так как C > B.
Foo(list); // Вот тут мы получаем уточнение и типа списка, и его элемента. Накладывается ограничение E >= List<E >= A>. В этот момент можно вычислить конкретный тип списка: List<B>.|
|
От: |
Serginio1
|
https://habrahabr.ru/users/serginio1/topics/ |
| Дата: | 23.05.25 14:12 | ||
| Оценка: | |||
|
|
От: |
Serginio1
|
https://habrahabr.ru/users/serginio1/topics/ |
| Дата: | 17.07.25 13:37 | ||
| Оценка: | 82 (1) | ||
Ключевое слово field
Токен field позволяет вам написать тело доступа к свойству, не объявляя явное поле для хранения данных. Маркер field заменяется на поле синтезированной резервной копии компилятора.
Например, ранее, если вы хотели убедиться, что свойство string не может быть установлено в null, вам нужно было объявить резервное поле и реализовать оба аксессора.
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}Вы можете определить тело для одного или обоих акцессоров свойства, связанного с полем.
Возможны существенные изменения или путаница при чтении кода в типах, которые также содержат символ с именем field. Вы можете использовать @field или this.field, чтобы разрешить неоднозначность между field ключевым словом и идентификатором, или переименовать текущий field символ, чтобы обеспечить чёткое различие.
Если вы попробуете использовать эту функцию и у вас будут отзывы, оставьте комментарий о вопросе относительно функции в репозитории csharplang.
Контекстное ключевое слово field представлено в C# 13 в качестве предварительной функции.
Неявные преобразования диапазона
C# 14 предоставляет первоклассную поддержку для System.Span<T> и System.ReadOnlySpan<T> в языке. Эта поддержка включает новые неявные преобразования, позволяющие более естественное программирование с этими типами.
Span<T> и ReadOnlySpan<T> используются различными ключевыми способами в C# и среде выполнения. Их введение повышает производительность без риска безопасности. C# 14 распознает связь и поддерживает некоторые преобразования между ReadOnlySpan<T>, Span<T>и T[]. Типы span могут выступать в качестве получателей методов расширения, комбинироваться с другими преобразованиями и помогать в ситуациях вывода универсальных типов.
Список неявных преобразований диапазона можно найти в статье о встроенных типах в разделе справочника по языку. Дополнительные сведения см. в спецификации функции для типов диапазонов первого класса.
Несвязанные обобщенные типы и nameof
Начиная с C# 14 аргумент nameof может быть несвязанным универсальным типом. Например, nameof(List<>) принимает значение List. В более ранних версиях C# для возврата List<int> имени можно использовать только закрытые универсальные типы, например List.
Простые лямбда-параметры с модификаторами
Модификаторы параметров, например scoped, , ref, inoutили ref readonly лямбда-выражения, можно добавить без указания типа параметра:
delegate bool TryParse<T>(string text, out T result);
// ...
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);Ранее добавление модификаторов было разрешено только в том случае, если объявления параметров включали типы параметров. В предыдущем объявлении требуется указывать типы для всех параметров.
TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);Модификатор params по-прежнему требует явно типизированного списка параметров.
|
|
От: |
VladD2
|
www.nemerle.org |
| Дата: | 14.08.25 21:02 | ||
| Оценка: | 76 (1) +1 | ||
public ReportError Error { get => field; private set => SetProperty(ref field, value); }