そのため、バグを再生するにはVisual Studio 2017 RCが必要です。 次に、コンソールアプリケーションを作成し、次の簡単なコードを挿入します。
class Program { class IwillCrash { public void Deconstruct(out int x) { x = 0; } } static void Main(string[] args) { //var (x) = new IwillCrash(); // BOOM! deconstruction feature crashes VS2017 RC } }
コードを理解していない人のために、その意味を理解しましょう。 ここでは、C#7の次のような革新が使用されています。
-タプル-タプル
-解体-および翻訳
たとえば、タプルは、言語の次の構文糖衣です。
以前は:
Tuple<int, string> MyFunc(Tuple<decimal, long> param)
次のことができます。
(int, string) MyFunc( (decimal, long) param )
この機能を使用するには、System.ValueTupleアセンブリをインストールする必要があることに注意してください。
インストールパッケージ "System.ValueTuple" -IncludePrerelease
解体、またはむしろ脱構築宣言または脱構築宣言-は、タプルを変数に解析し、同時に定義する機能です。
たとえば、次のように:
(string first, string middle, string last) = LookupName(id1);
メソッドが次のように宣言されている場合:
(string, string, string) LookupName(long id)
上記の構築の結果は、 LookupNameメソッドがタプルとして返す3つの新しい変数、first、middle、lastの宣言になります。 つまり、タプルは3つの変数に分割されます。
破壊的な宣言は、タプルだけでなく、カスタムクラスにも適用されます。 1つの条件は、Deconstructという名前のデコンストラクターメソッドの定義です。 上記の例のように。 この機能により、クラスオブジェクトをコンポーネント部分に分割できます。
例:
class Point { public void Deconstruct(out int x, out int y) { x = 1; y = 2; } } (var myX, var myY) = new Point(); // Deconstruct(out myX, out myY);
ご理解のとおり、結果としてmyX = 1、myY = 2になります。
彼らはそれを理解したようです。 ここで一息ついて、投稿の冒頭にあるコードのコメントを外します。
![画像](https://habrastorage.org/getpro/habr/post_images/d56/40f/ea6/d5640fea654f2e5354d1b83cafc3eb69.jpg)
公平に言えば、.NET Coreの場合、このコードは機能します。 たぶん、これはとても難しい考えですか?
レポートは投稿が表示される前にバグに送信されたため、リリースを修正する必要があります。
→ C#7の新機能の説明はこちらにあります。
UPD:コメントのVarim habrayuzerのリクエストで、MicrosoftがVisual Studioの既知のバグのリストを保持している場所を見つけました。 投稿で説明されているバグはこちらです。