c#6.0では複数の戻り値を返せるようになる(かもしれない)
前回こんなエントリー書いた矢先に新しいコンパイラ(Roslyn)が登場、しかもオープンソース化されるという一報が飛び込んできた訳だが、公式サイトに書いてあるこの3つは間違いなくC#6.0に入ると見て間違いないと思う。
- Primary constructors (
public class Point(int x, int y)
) - Declaration expressions (
s.TryParse(out var x)
) - Indexed members (
json.$x
)
んで、相変わらずまともなソースがなくて申し訳ないが、海外版のWikipediaにはこんなリストがある。
- Succinct syntax for primary constructors
- Declaration expressions
- Indexed members
- Import of static type members into namespace
- Exception filters
- Index initializers
- Await in catch/finally blocks
- Readonly properties
- Property expressions (property lambdas)
- Method expressions
- Parameter arrays for IEnumerable interfaces
- Null propagator (Succinct null checking)
- Multiple return values
- Constructor type inference
- Syntax for writing binary numbers and large decimal
大半は既に噂されているものなのであるが…
Multiple return values
Multiple return values
Multiple return values
Multiple return values
Multiple return values
やっと来たか!
実はこれ、C#だけでなく他の言語でも何でできないのか非常に疑問に思っていた部分である(確か関数型言語ではできるのもあったかもしれない)。コンパイラなんてとても書いた事ないが、実装的にもパーサを多少弄るだけで、インラインで複数変数を宣言できる言語であれば、そう苦労せずに実装できそうに思えてならないのである。
ただ、RubyとかJavaScriptみたいな動的言語であれば、順番に従わないといけない複数の戻り値を扱うより、適当にハッシュなりオブジェクトを返した方がいいってことで、あまり導入する必要性ないかもしれないなーというのは分かる。でもIDEの強い補助を享受できて、なおかつハッシュの使い勝手が悪い静的型付け言語ではこれはあって然るべしだと思う。
シンタックスはこんな感じだろうか。
private int, string, Object getValues() { return 0, "", null; } var a, b, c = getValues();
…つーか、よくよく調べてみたらScalaでは既にできるらしい。