2015-12-04 3 views
9

私はVS2015.1にアップグレードしたばかりで、私のプロジェクトをコンパイルしようとするとコンパイラがクラッシュしました。次のレポコードをコンソールアプリケーションに入れて(そしてmoq.dllへの参照を追加すると)12行目のコードがコンパイラにクラッシュします。それはRoslyn lamdbaの書き換え呼び出しの間に起こるようです。このラムダを書き直そうとすると、なぜRoslynがクラッシュするのですか? (Visual Studio 2015 update 1)

using System.Collections.Generic; 
using System.Linq; 
using Moq; 

namespace RoslynError 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     var mockRepo = new MockRepository(MockBehavior.Strict); 
     var obj = mockRepo.OneOf<DTO>(x => x.Value == (OptionEnum?)null); 
    } 
    } 

    class DTO 
    { 
    public DTO(OptionEnum? enumVal) 
    { 
     Value = enumVal; 
    }  

    public OptionEnum? Value; 
    } 

    enum OptionEnum 
    { 
    NotSpecified  
    } 
} 

誰でもクラッシュが発生する理由を知っていますか?

using System; 
using System.Linq.Expressions; 

namespace Bug461 
{ 
    class Program 
    { 
    enum Test { } 

    static void Main() 
    { 
     Expression<Func<Test?, bool>> x = t => t == (Test?)null; 
    } 
    } 
} 

編集:

+0

部品番号への参照がほとんど関連性がある:私は提案した修正とプル要求を行いました。重要なことは、ラムダの矢印が単純なデリゲートのインスタンス( 'Func ')のものではなく、(式>の)式ツリーに変換されるということです。 –

答えて

9

は、以下の簡単な例では、式ツリーに型変換ノードの書き換えに関連する問題を再生私は警告を回避するためにわずかにコードを編集しました。

編集2:バグはhttps://github.com/dotnet/roslyn/commit/5c602fc6によって引き起こされます。降格されたenumオペランド(nullリテラル)は、関連付けられた型を持っていません。

編集3:https://github.com/dotnet/roslyn/pull/7227

+0

[tryroslyn.azurewebsites.net](http://tryroslyn.azurewebsites.net/)でこれがコンパイルされます。 nullでない 't'と' null'を比較するという点で有効な警告があります。問題のコードでは、 '=='演算子の両側はすでに(ラッピングなしで)nullableです。 –

+1

はい、VS 2015アップデート1のみがインストールされていても、Visual Studioでローカルにコンパイルするとクラッシュします。 –

+0

@SuneFoldager:あなたが無効なコードを発行したため:DあなたのPRのテスト失敗を見てください。 PS:PRでテストを追加する必要があります。 – leppie

関連する問題