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の既知のバグのリストを保持している場所を見つけました。 投稿で説明されているバグはこちらです。

Source: https://habr.com/ru/post/J317804/


All Articles