Visual Studio 2014 CTP
Visual Studio 2014 CTPのプレビュー版出てた。
2013とside-by-sideで入らないとのことでちょっとさすがに触れずにいたものの、1日遅れでAzure VM Galleryに並ぶようになったんでそちらを使ってVM上で試すことに。
MSDNブログ情報
MSの各製品チームとかから一斉に情報が。
side-by-side不可
もちろん最終的には他のバージョンのVisual Studioと共存できるようにするつもりだけども、今回は不具合が残っててできないということみたい。そのうち治るはず。
今は、そもそも別のバージョンが入っていたらインストーラーが警告出して止まる。回避方法もあるものの、VS 2014 CTPをインストールしてアンインストールすると、VS 2013とかに悪影響を残すとか。
C# 6.0 experimental
//build/ の前後で出た状態のRoslyn CTP以降、null伝搬 . 演算子が実装されたみたいですね。
null伝搬
以下のようなもの。要するに、p == null ? null : p.Name の短縮形。
using System;
class Program
{
static void Main(string[] args)
{
X(null);
X(new Point(1, 2, null));
X(new Point(1, 2, "aaa"));
}
static int? X(Point p)
{
try
{
var len = p?.Name.Length;
Console.WriteLine("no error " + len);
return len;
}
catch
{
Console.WriteLine("error");
return null;
}
}
}
class Point(int x, int y, string name)
{
public int X { get; } = x;
public int Y { get; } = y;
public string Name { get; } = name;
}
実行結果は以下の通り。
ちなみに、VS 2014 CTPを使ってみる他、Roslynのソースコードをgithubから最新版とってきてビルドすればVS 2013でも試せるはず。
null伝搬のショートサーキット
前にフォーラムをのぞいてみたところ、null伝搬演算子を左結合にするか右結合(ショートサーキット評価)にするか悩んでたはずですけども、上記の結果を見る限り、とりあえず現状では右結合(ショートサーキット評価)で実装されてるみたいですね。
右か左かっていうのは以下のような話。
左結合 | 右結合(ショートサーキットあり) | |
a?.b?.c の解釈順 | (a?.b)?.c | a?.(b?.c) |
a?.b?.c と同じ結果になるコード | var b = a == null ? null : a.b; var c = b == null ? null : b.c; return c; |
if (a == null) return null; var b = a.b; if (b == null) return null; var c = b.c; return c; |
a?.b.c で、aがnullだったら | (a?.b) の結果がnullなので、.c の時点でぬるぽ例外。 | a == null 判定の時点でもう .c を見ないので、例外は出ずに null が返る。 |
判定順をあえて変えたい時は | a?.(b?.c) という式がC#としては不自然で、1つの式では書けない | (a?.b)?.c |
採用の根拠 | 演算子はほとんどが左結合なので自然といえば自然。 | 条件演算子 ? : や null 結合演算子 ?? はショートサーキット評価なので、それと合わせるならこちらの方が自然。 |
C# 6.0 (試験実装)を使いたいなら
この機能、まだ正式にC# 6.0になったわけではないので、ビルド オプションで「C# 6.0」を選んでも使えません。というか、Visual StudioのUI上から設定できる場所はなくて、 .csproj を直接メモ帳とかで編集する必要があります。
C#チーム ブログで書かれてますが、<LangVersion>タグの中身を experimental に変えます。
[…] Visual Studio 2014 CTP | ++C++; // 未確認飛行 C ブログ […]
Visual Studio 2014 CTP | ++C++; // 未確認飛行 C ブログ | Winインフォメーションまとめプラザ
2014年6月8日 at 09:00