2017-09-25 13 views
-2

私はアップグレードプロジェクトを進めており、最近アップグレードされたバージョンのDLLで問題が発生し始めました。私は、元のDLLを逆コンパイルし、ステートメントの場合は、次を発見した:この演算子は何ですか、 "??"

if (fieldConfiguration == null && Context.ContentDatabase != null) 
{ 
    Item obj = Context.ContentDatabase.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

私は、DLLのバージョンアップを逆コンパイルし、次のように声明をした:

if (fieldConfiguration == null && (Context.ContentDatabase ?? Context.Database) != null) 
{ 
    Item obj = Context.ContentDatabase.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

私はコードをステップ実行することができましたDLLをdotPeekで逆コンパイルし、dotPeekシンボルサーバーの機能を使用します。 Context.ContentDatabaseがnullであるため、アップグレードDLLを使用しているときにコードが失敗していることがわかります。私が理解していないのは、その二重三項演算子がどのように評価されるかです。誰かが私のために明確にすることができますか?このアセンブリの作成者がContext.ContentDatabaseのヌルチェックを望んでいたように見えますが、誤っている可能性があります。助けてくれてありがとう!

+3

バイナリnull-coalesce演算子( '?')を "ternary"と呼んでいますか? –

+0

うん、それはそれがhahaと呼ばれていたことを知らなかった –

+0

だから "二重三元"は "二つの疑問符"を意味する?単項は何かがあることを意味し、バイナリは何かを意味し、三項は三を意味し、四次は明白でなければならない。 –

答えて

2

まあええそれは誤りのように見えます。コードでContext.ContentDatabaseまたはContext.Databasenullでないかどうかを調べていて、nullであっても、引き続きコードを使用しています。

コードは次のようになります。それはヌル合体演算子を使用して別々の変数にデータベースを格納し、それがnullない場合、その上で動作する

var database = Context.ContentDatabase ?? Context.Database; 

if (fieldConfiguration == null && database != null) 
{ 
    Item obj = database.SelectSingleItem(
     string.Format("//*[@@templateid='{0}' and @@key='{1}']", 
      (object) TemplateIDs.TemplateField, (object) fieldName)); 
} 

を。

このライブラリを提供しているチームに連絡し、バグを報告する必要があります。

+0

ありがとう!それは私がデバッグに基づいて進んでいたと思っていたものですが、赤旗を立てる前に第二の意見を求めていました。学んだ新しいオペレータのように見える! –

+0

これはサードパーティのDLLにありますので、私は彼がそれを支配していないと仮定しました。逆コンパイルと修正の後にアセンブリをコンパイルすることは可能ですが、私は過去にそれを行っています。しかし、ソフトウェアをリリースしなければならない場合、または権利を侵害した場合、これは致命的な終わりになる可能性があります。 –

0

Context.ContentDatabaseとContext.Databaseが同じタイプであると仮定します。以下のコードは動作するはずです。

+0

私はこのインスタンスでソースコードにアクセスすることはできませんが、私は赤い旗を立てると間違いなくこれを送ることができます。ありがとう! –

関連する問題