26

これはバグ報告だと思われるかもしれませんが、ここで私がひどく間違っているのか、それとも Eric や Microsoft の誰かから説明があるのか​​知りたいです。

アップデート

これは現在、Microsoft Connectのバグとして投稿されています。

説明

次のクラスを検討してください。

class A 
{
    public object B {
        set { }
    }
}

ここでA.Bは、書き込み専用ですが、それ以外は問題のないプロパティです。ここで、式の中でそれを代入すると
想像してください:

Expression<Func<A>> expr = 
    () => new A {
        B = new object { }
    };

このコードにより、C# コンパイラ ( 3.5 .30729.4926 と4.0 .30319.1 の両方) が出力されます。

内部コンパイラ エラー (アドレス 013E213F の 0xc0000005): 原因はおそらく 'BIND' です。

クラッシュします。

ただし、オブジェクト初期化構文 ( { }) をコンストラクター ( ( )) に置き換えるだけで、問題なくコンパイルできます

再現用の完全なコード:

using System;
using System.Linq.Expressions;

class Test {
    public static void Main()
    {
        Expression<Func<A>> expr = 
            () => new A {
                B = new object { }
            };
    }
}

class A {
    public object B { set { } }
}

(そして、はい、実際のプロジェクトに取り組んでいます。

4

2 に答える 2

8

残念ながら、私は Eric Lippert ではありません (ああ、でも私はそんなに威勢がいいかもしれません...) が、ソースを検索できる元 Visual Studio 言語担当者として、これについて 2 つのことを言うことができます。

  1. "Internal Compiler Error" で始まるものを見たときはいつでも、間違いなくバグを発見したことになります。C#、VB、または C++ コンパイラのいずれであっても、そのエラーが存在するのはそのためです。それは「ああ、クソ、何かが本当に予想外にうまくいかなかった!」です。手を上げて救済するエラー。

  2. それを超えて、これは間違いなく報告されるべき C# コンパイラのバグです。クラッシュしているコードは、プロパティでイニシャライザを実行しているときに、それが参照できるゲッターがあると想定しています。この場合、ありません。奇妙なことに、構築されている型を「オブジェクト」ではなく「C」型に変更すると、クラッシュは発生しないため、スタックのさらに上にあるエラーであると推測しています (つまり、コードは決して取得されるべきではありませんでした)。プロパティゲッターを探していたところまで)。

お役に立てれば。

于 2011-07-02T01:43:11.050 に答える
0

これは、エラーに関連してオンラインで見つけたものです。

Microsoft によって 2010 年 3 月 9 日午前 10 時 58 分に投稿されました。

皆さん、ご報告ありがとうございます。この問題は RC 後に修正されたと思います。問題は、C# コンパイラがエラーまたは警告を報告しようとしてクラッシュすることです。いくつかのケースで、LIB 環境変数に無効なパスが含まれているという警告が報告されているのを見てきました。クラッシュを回避するには、LIB 環境変数に有効なパスが含まれていることを確認してください。

よろしく、

Ed Maurer 開発マネージャー、VB および C# コンパイラ

于 2011-06-24T17:43:45.047 に答える