問題タブ [compiler-bug]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - このジェネリックシナリオがTypeLoadExceptionを引き起こすのはなぜですか?
これは少し時間がかかるので、ここにクイックバージョンがあります:
なぜこれがランタイムTypeLoadExceptionを引き起こすのですか?(そして、コンパイラーは私がそれをするのを防ぐべきですか?)
Dをインスタンス化しようとすると、例外が発生します。
より長く、より探索的なバージョン:
検討:
C.Foo()
の型制約がの型制約と一致しないため、これは不正ですI.Foo()
。コンパイラエラーCS0425を生成します。
しかし、私はルールを破ることができるかもしれないと思いました:
Object
T2の制約として使用することにより、その制約を否定しています。D.Foo<T>()
すべてがから派生しているため、任意のタイプをに安全に渡すことができObject
ます。
それでも、コンパイラエラーが発生することを期待していました。C#言語の意味では、「C.Foo()の制約はI.Foo()の制約と一致する必要がある」という規則に違反しており、コンパイラーは規則に固執するだろうと思いました。しかし、それはコンパイルします。コンパイラーは私がしていることを見て、それが安全であることを理解し、目をつぶっているようです。
私はそれでうまくいったと思ったが、ランタイムはそれほど速くないと言っている。のインスタンスを作成しようとするとD
、TypeLoadExceptionが発生します。「タイプ'D'のメソッド'C`1.Foo'は、より弱いタイプパラメータ制約を持つインターフェイスメソッドを暗黙的に実装しようとしました。」
しかし、そのエラーは技術的に間違っていませんか?の制約を無効にするObject
ためにを使用しないので、-と同等になります-より強くはありませんか?コンパイラは同意しているようですが、ランタイムは同意していません。C<T1>
C.Foo()
I.Foo()
私の主張を証明するために、私D
は方程式からそれを取り除くことによってそれを単純化しました:
だが:
これはコンパイルされ、に渡されるすべてのタイプに対して完全に実行されFoo<T>()
ます。
なんで?ランタイムにバグがありますか、または(より可能性が高いですが)私が表示されていないこの例外の理由があります-その場合、コンパイラは私を止めるべきではありませんか?
興味深いことに、制約をクラスからインターフェースに移動することによってシナリオが逆転した場合...
そして再び私は制約を否定します:
今回は問題なく動作します!
何でもあり、それは私には完全に理にかなっています。D
(方程式の有無にかかわらず同じ)
では、なぜ最初の方法が壊れるのでしょうか?
補遺:
TypeLoadExceptionの簡単な回避策があることを追加するのを忘れました:
明示的に実装することI.Foo()
は問題ありません。暗黙的な実装のみがTypeLoadExceptionを引き起こします。今、私はこれを行うことができます:
しかし、それはまだ特別な場合です。System.Object以外のものを使用してみてください。これはコンパイルされません。意図的にこのように機能するかどうかわからないので、これを行うと少し汚く感じます。
c# - これはダイナミックのバグですか?
ジェネリック クラスを使用して動的ディスパッチを実装dynamic
し、ジェネリック型パラメーターが別のクラスのプライベート 内部クラスである場合、ランタイム バインダーは例外をスローします。
例えば:
ここではRuntimeBinderException
、メッセージとともに a がスローされます
「Dispatcher.CallDispatch(int)」は、保護レベルが原因でアクセスできません
アクセスできない理由は、型パラメーターT
がアクセスできないプライベートCallType
であるDispatcher<T>
ためです。したがって、CallDispatch
アクセスできない必要がありますが、 としてアクセスできるため、そうではありませんT
。
これは のバグdynamic
ですか、それともサポート対象外ですか?
c++ - 名前空間内の新しい演算子
次のようなエラーメッセージが表示されます。
それはgccコンパイラのバグですか?古いgccバージョンでは、機能しているようです。何か考え、なぜそれが許可されないのですか?
ユースケース:クラスのカスタムのみoperator new/delete
を許可し、グローバルを禁止したかったnew/operator
。リンカエラーの代わりに、コンパイラエラーを簡単にキャッチできました。だから私はコーディングしました:
これは古いバージョンのgccでは機能しましたが、新しいバージョンでは機能しませんでした。
c# - C#コンパイラのバグ? 式の書き込み専用プロパティに使用されるオブジェクト初期化子構文により、csc がクラッシュする
これはバグ報告だと思われるかもしれませんが、ここで私がひどく間違っているのか、それとも Eric や Microsoft の誰かから説明があるのか知りたいです。
アップデート
これは現在、Microsoft Connectのバグとして投稿されています。
説明
次のクラスを検討してください。
ここでA.B
は、書き込み専用ですが、それ以外は問題のないプロパティです。ここで、式の中でそれを代入すると
想像してください:
このコードにより、C# コンパイラ ( 3.5 .30729.4926 と4.0 .30319.1 の両方) が出力されます。
内部コンパイラ エラー (アドレス 013E213F の 0xc0000005): 原因はおそらく 'BIND' です。
クラッシュします。
ただし、オブジェクト初期化構文 ( { }
) をコンストラクター ( ( )
) に置き換えるだけで、問題なくコンパイルできます。
再現用の完全なコード:
(そして、はい、実際のプロジェクトに取り組んでいます。)
c# - C#コンパイラはyield returnメソッドを同様のものとして認識しませんか?
同じシグニチャを持つ2つのyield return
メソッドがある場合、コンパイラはそれらが類似していると認識していないようです。
私はyield return
このような2つの方法があります:
これにより、次のステートメントが正常にコンパイルされることを期待します。
Func<int, IEnumerable<int>> generator = 1 == 0 ? EvenNumbers : OddNumbers; // Does not compile
エラーメッセージが表示されます
'メソッドグループ'と'メソッドグループ'の間に暗黙の変換がないため、条件式のタイプを判別できません
ただし、明示的なキャストは機能します。
Func<int, IEnumerable<int>> newGen = 1 == 0 ? (Func<int, IEnumerable<int>>)EvenNumbers : (Func<int, IEnumerable<int>>)OddNumbers; // Works fine
私は何かが足りないのですか、それともこれはC#コンパイラのバグですか(VS2010SP1を使用しています)?
注:私はこれを読みましたが、最初のものはうまくコンパイルされるべきだったと今でも信じています。
編集:var
コードスニペットでの使用法を削除しました。これは私が意図したものではなかったためです。
c++ - 互換性のないタイプをうまくリンクすると、混乱につながります
私はg++
、特にリンク(C ++)オブジェクトファイルのいくつかの境界を理解しようとしてきました。質問する前に、できるだけ圧縮しようとした次の好奇心を見つけました。
コード
ファイルcommon.h
a.cpp
でコンパイルされたファイルg++ -Wall -c a.cpp
b.cpp
でコンパイルされたファイルg++ -Wall -c b.cpp
main.cpp
コンパイルおよびリンクされたファイルg++ -Wall a.o b.o main.cpp
結果./a.out
は
質問
さて、私はリンクを試みて一緒g++
にしようとするために私にいくつかの厄介な名前を呼ぶことを期待していました。特にの割り当ては悪です。それはまったく文句を言わないだけでなく、同じ名前()の互換性のない型をリンクさせたいだけでなく、 (resp。)の2次定義を完全に無視します。a.o
b.o
za.y = zb.y
g++
Y
b.o
b.cpp
私はこれまでのところフェッチされた何かをしていないことを意味します。2つのコンパイルユニットがローカルクラスに同じ名前を使用できることは非常に合理的です。大規模なプロジェクトで。
これはバグですか?誰かがこの問題に光を当てることができますか?
c++ - 名前空間でクラスを前方定義しますか?
次のスニペットはVisualStudio2010でコンパイルできませんが、GCCはそれを気に入っています。
私はここで愚かなことをしていますか、それともこれは有効なコンパイラのバグですか?私が得るエラーは次のとおりです。
error C2888: 'void Bar::Foo(void)' : symbol cannot be defined within namespace 'Test'
GCC 4.5.1でコンパイルされます:http://ideone.com/7sImY
[編集]明確にするために、これが有効なC ++であるかどうか(もしそうなら、なぜそうではないか)を知りたいのですが、コンパイルするための回避策は素晴らしいですが、この質問の一部ではありません。
c++ - これは Visual Studio 2010 のコンパイラ エラーですか?
この条件にバグがあります:
リリース モード中に無限ループに陥ったようです。デバッグモードでは正常に動作しますが、最後の行にデバッグ出力を配置すると、より興味深いものになります
条件自体の生成されたアセンブリを次に示します。
2 番目の条件では、bool 型の関数パラメーターである「dontRotate」の値を eax に移動し、それと比較しているように見えますが、dontRotate はそのコードの近くでは使用されていません。
これが少し小さなデータかもしれないことは理解していますが、個人的には明らかなコンパイラ エラーのように思えます。しかし悲しいことに、実際にバグレポートを作成するのに十分な自己完結型の問題にそれを抽出する方法がわかりません。
編集:実際の減速ではなく、タイプ:
編集2:
while の最後に debug print ステートメントを追加すると、これは生成されるアセンブリであり、もはやバグを表現していません。
c++ - VS2010 SP1 の関数テンプレートでのコンパイラ エラー
マークされたコンパイラ エラー (C2899) が表示されるのはなぜですか? VS2010 SP1でやってみました。
よろしく
サイモン
PS: で使用できることはわかってstd::copy(..)
いますstd::back_inserter(..)
が、それは重要ではありません。
編集
質問は perreal のコメントで回答されました: http://connect.microsoft.com/VisualStudio/feedback/details/694857/bug-in-lambda-expressions
編集
回避策には興味がないことに注意してください。上記のコードがコンパイルされるかどうかを知りたいです。
parsing - これは F# 2.0 パーサーのバグですか?
Microsoft (R) F# 2.0 インタラクティブ ビルド 4.0.40219.1
新しいレコードタイプを定義しようとしています:
すべて問題ありませんが、もう 1 つフィールドを追加しましょう。
そして、上記の位置でパーサー エラーが発生しています。
コードの何が問題になっていますか? コンパイラのバグですか?