2017-09-25 25 views
-2

저는 업그레이드 프로젝트를 진행하고 있으며 최근에는 업그레이드 된 버전의 DLL에 문제가 발생하기 시작했습니다. 나는 원래 DLL을 디 컴파일하고 다음 if 문 발견이 연산자는 무엇입니까 "??"

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)); 
} 

나는 코드를 단계별로 할 수 있었다 dotPeek로 DLL을 디 컴파일하고 dotPeek 심볼 서버 기능을 사용합니다. Context.ContentDatabase가 null이므로 업그레이드 DLL을 사용할 때 코드가 실패하고 있음을 알 수 있습니다. 내가 이해할 수없는 것은 이중 삼항 연산자가 어떻게 평가되는지에 있습니다. 누군가가 저에게 무슨 일이 일어나는지 분명히 할 수 있습니까? 이 어셈블리의 제작자가 Context.ContentDatabase에 대해 null 체크를 원했지만 실수를했을 수도 있습니다. 도와 주셔서 감사합니다!

+3

이진 null-coalesce 연산자 ('? ') "삼항"을 호출하고 있습니까? –

+0

그래, 그게 뭔지 몰랐어 하하 –

+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

이것은 제 3 자 dll에 있기 때문에, 나는 그가 그것을 통제하지 않는다고 생각했다. 디 컴파일 + 수정 후에 어셈블리를 컴파일하는 것은 가능하지만, 나는 과거에 그렇게 해왔다. 그러나 소프트웨어를 공개해야하거나 권리를 침해하면 막 다른 길일 수 있습니다. –

0

Context.ContentDatabase와 Context.Database가 같은 유형이라고 가정합니다. 아래 코드가 작동해야합니다.

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

이 인스턴스에서는 소스 코드에 액세스 할 수 없지만 적색 플래그를 올리면이 코드를 확실히 보낼 수 있습니다. 감사! –