C#7の新機能を使用する場合のVisual Studio 2017 RCのバグ

.NETの世界の皆さんの多くは、MicrosoftがVisual Studio 2017 RCをリリースしたのはごく最近(1か月前)であり、もちろんC#7が付属していることを知っているでしょう。 新しいバージョンの可能性を探る、Visual Studioは突然クラッシュしました。 方法-カットの下で読んでください。



そのため、バグを再生するには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になります。



彼らはそれを理解したようです。 ここで一息ついて、投稿の冒頭にあるコードのコメントを外します。



画像 焦点は成功でした-スタジオは姿を消し、テスターは解雇され、ダッシュボードの開発者チケットがさらに増えました。



公平に言えば、.NET Coreの場合、このコードは機能します。 たぶん、これはとても難しい考えですか?

レポートは投稿が表示される前にバグに送信されたため、リリースを修正する必要があります。



C#7の新機能の説明はこちらにあります。



UPD:コメントのVarim habrayuzerのリクエストで、MicrosoftがVisual Studioの既知のバグのリストを保持している場所を見つけました。 投稿で説明されているバグはこちらです。



All Articles