Здравствуйте, vaa, Вы писали:
vaa>Или могут? Или нельзя, но иногда можно?
Давайте разберёмся. Свойство — это пара методов со специальным синтаксисом вызова, похожим на обращение к полю.
Можно обратно деконструировать их до методов:
public abstract class Sample<T>
{
public abstract void SetA(T value);
public abstract T GetA();
}
Теперь можно сделать эти методы асинхронными:
public abstract class Sample<T>
{
public abstract Task SetA(T value) {};
public abstract Task<T> GetA() {};
}
Из сигнатур методов видим, что превратить эти методы обратно в свойство не получится, т.к. у них неподходящие сигнатуры.
Сделать read-only асинхронное свойство можно:
public abstract class Sample<T>
{
public abstract Task SetA(T value) {};
public abstract Task<T> A {get};
}
Sample<int> sample = ...;
var v = await sample.A; // type of v = int;
Но вот асинхронную
установку значения в таком стиле сделать не выйдет.
Sample<int> sample = ...;
await sample.A = 42; // oops!
await sample.SetA(42); // ok
Tсли бы это было возможно, как бы должен был работать код типа такого:
Sample<int> sample = ...;
await sample.A += 5; // oops!
Будет ли там 2 await двух методов, выполненные один за другим?
Общее мнение команды C# — async свойства не нужны. См. тж.
https://github.com/dotnet/roslyn/issues/3015