Open ufcpp opened 3 weeks ago
try
{
await Task.WhenAll(t1, t2, t3, t4);
}
catch(Exception ex)// これの例外、最初の1個しか来ない。
{
Console.WriteLine((t1.IsCompleted, t2.IsCompleted, t3.IsCompleted, t4.IsCompleted));
}
// 例外漏らしたくなければこう書いた方がいい気がする。
await foreach (var t in Task.WhenEach(t1, t2, t3, t4))
{
try
{
await t;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
lock 抜けるときに例外出るやつ
foreach (var item in M())
{
await Task.Delay(1);
}
static IEnumerable<object?> M()
{
lock (new object())
{
yield return null;
}
}
M<int, MyList, MyList.MyEnumerator>(new MyList());
static void M<TElement, TEnumerable, TEnumerator>(TEnumerable list)
where TEnumerable : IEnumerable<TElement, TEnumerator>, allows ref struct
where TEnumerator : IEnumerator<TElement>, allows ref struct
{
foreach (var item in list)
{
}
}
interface IEnumerable<T, TEnumerator>
where TEnumerator : IEnumerator<T>, allows ref struct
{
TEnumerator GetEnumerator();
}
class MyList : IEnumerable<int, MyList.MyEnumerator>
{
public MyEnumerator GetEnumerator() => new MyEnumerator();
public struct MyEnumerator : IEnumerator<int>
{
public int Current => throw new NotImplementedException();
object IEnumerator.Current => throw new NotImplementedException();
public void Dispose()
{
throw new NotImplementedException();
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}
}
interface ICollection<T>
{
public int Length { get; }
[UnscopedRef]
ref T this[int index] { get; }
}
readonly ref struct SpanWrapper<T>(Span<T> span) : ICollection<T>
{
private readonly Span<T> _span = span;
public int Length => _span.Length;
// unscoped ref 要らない。
public ref T this[int index] => ref _span[index];
}
struct Int4 : ICollection<int>
{
private int _x0, _x1, _x2, _x3;
public readonly int Length => 4;
[UnscopedRef]
public ref int this[int index] => ref Unsafe.Add(ref _x0, index);
}
ref struct S
{
private Span<int> _span;
// OK
public void M1(Span<int> span) => _span = span;
// ダメ。これが scoped の効果。
public void M2(scoped Span<int> span) => _span = span;
// ダメ。params は暗黙的に scoped になる。
public void M3(params Span<int> span) => _span = span;
}
Handler M()
{
Span<char> buffer = stackalloc char[256];
var x = 1;
Handler handler = default;
handler.AppendFormatted(x);
return handler;
}
ref struct Handler
{
Span<char> 書き込み先;
public void AppendFormatted<T>(in T value)
{
}
public void AppendFormatted(scoped ReadOnlySpan<char> value)
{
}
}
exit code -2146232797.
配信URL: https://www.youtube.com/live/BkN6_8ZQQW8
IDE
library
Task.WhenAll(t1, t2)
とかstring.Format("", a, b, c, d)
とかが ReadOnlySpan にX`T
みたいな記法を Parse できるっぽいSearchValues<string>
作るの今までなかったんだC
今回で ref/unsafe in iterators/async と ref struct interfaces 入ってる。
でも、runtime 側の、BCL に allows ref struct 付けるやつ(runtime 102795)は main に merge 済みだけど .NET 9p5 には含まれてなさげ。
Allow ref and unsafe in iterators and async
allows ref struct
基本、型引数 where T : allows ref struct に対して Span とかと同じエスケープ解析してるだけっぽく、 C# 12 で ref struct に対してダメなことは T に対してもダメ。
なので入れ子ダメか…
ValueTuple は allows ref じゃない…
Span<Span> もダメだったみたいね。
(
T[]
受け付けるコンストラクターをどうするの?問題があることは知ってたので「やっぱり」。)てか、 runtime 102795 (BCL に allows ref 付ける作業)がまだ取り込まれてないっぽい。
なのでラムダ式の自然な型もまだ変化なし。(たぶん、予定では変わるはず?)
<ref T>
https://github.com/dotnet/csharplang/blob/main/proposals/ref-struct-interfaces.md#foreach-statement allows ref struct で foreach も行けるけど… 型引数2個渡さないといけなくてだるい…