Closed ufcpp closed 5 years ago
struct X
{
public void Deconstruct() { }
public void Deconstruct(out int a) => a = 0;
public void Deconstruct(out int a, out int b) => (a, b) = (0, 0);
}
Console.WriteLine(x is ());
Console.WriteLine(x is var ());
Console.WriteLine(x is X ());
//Console.WriteLine(x is (1)); // これは Deconstruct 見ない。 x is 1 と同じ意味。エラーに。
Console.WriteLine(x is (1) _);
Console.WriteLine(x is (0) _);
Console.WriteLine(x is X (1));
Console.WriteLine(x is X (0));
//Console.WriteLine(x is var (0)); // これはダメ
Console.WriteLine(x is (_, _));
Console.WriteLine(x is (1, _));
Console.WriteLine(x is (0, 0));
オーバーロード解決はせず
using System;
using System.Runtime.CompilerServices;
class X : ITuple
{
public object this[int index] => index;
public int Length => 3;
}
class Program
{
static void Main()
{
M(new X());
}
static void M(object x)
{
if (x is (int a, int b, int c))
{
// マッチする。 (0, 1, 2) が表示される。
Console.WriteLine((a, b, c));
}
}
}
前にブログ書いたやつ: https://ufcpp.net/blog/2018/12/cs8patterns/
ページ追加・既存ページ修正
書くこと
bool X<T>(T x) => x is null;
(ジェネリックな変数に is null)が行けるようになるもの 8.0 からvar _
は行けるけど_
だけはダメ(1, _)
とかvar
なしで discard 書けるT(1, 2)
みたいに型指定 + 位置/プロパティ パターンも書ける(1, 2)
みたいに型を省略できるvar (...)
か(...) _
みたいな書き方必要x is ()
。0-tuple はパターンでだけ使える。分解代入・宣言では使えない。T1 { X: T2 _, Y: T3(1, 2) }
みたいに入れ子にできるnew T(1, 2)
で構築できるんなら、is T(1, 2)
でマッチできていいはずnew T(x: 1, y: 2)
で構築できるんなら、is T(x: 1, y: 2)
でマッチできていいはずnew T { X = 1, Y = 2 }
で構築できるんなら、is T { X: 1, Y: 2 }
でマッチできていいはずDeconstruct
メソッドの呼び出し自体消えることがある