c#逻辑中的三元条件无法正常工作

时间:2019-07-17 16:01:34

标签: c#

我在c#中编写了一个三元条件,该条件不能正确评估。我正在检查两个条件是否都满足,则应返回true,否则返回false。目前,即使一个条件失败,它也将返回true。因此,即使docType为Flashnotes为true,canView也会设置为true。考虑一下此IoC.Resolve()。Authorize(“ Put”,“ ManageDocuments”)  始终返回true,而docType可能会也可能不会返回true

doc.canView = IoC.Resolve<IClientAuthorizationService>().Authorize("Put", "ManageDocuments") ==
                                  AuthAccessLevel.Full &&  i.DOCUMENT_TYPE_ID != (int) DocumentType.FlashNotes ||
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.CallMeetingNotes || 
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.OtherNotes || 
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.TearSheet
                        ? true
                        : false;

4 个答案:

答案 0 :(得分:2)

如果我已正确理解这一点,那么i.DOCUMENT_TYPE_ID的条件之一必须等于true?先加上括号将其等同。

doc.canView = IoC.Resolve<IClientAuthorizationService>().Authorize("Put", "ManageDocuments") ==
                              AuthAccessLevel.Full &&  (i.DOCUMENT_TYPE_ID == (int) DocumentType.FlashNotes ||
                                                       i.DOCUMENT_TYPE_ID == (int)DocumentType.CallMeetingNotes || 
                                                       i.DOCUMENT_TYPE_ID == (int)DocumentType.OtherNotes || 
                                                       i.DOCUMENT_TYPE_ID == (int)DocumentType.TearSheet)

由于它已经是布尔值了,所以也不需要真或假。

答案 1 :(得分:1)

我认为您正在尝试做的事情可以简化为以下形式:

var rejectedTypes = new[] { DocumentType.FlashNotes, DocumentType.CallMeetingNotes,
                            DocumentType.OtherNotes, DocumentType.TearSheet }.Cast<int>();
var accessLevel = IoC.Resolve<IClientAuthorizationService>()
                     .Authorize("Put", "ManageDocuments");
doc.canView = ((accessLevel == AuthAccessLevel.Full) &&
               !rejectedTypes.Contains(i.DOCUMENT_TYPE_ID));

答案 2 :(得分:0)

我认为这里的逻辑有误。试试:

doc.canView = IoC.Resolve<IClientAuthorizationService>().Authorize("Put", "ManageDocuments") ==
                                  AuthAccessLevel.Full &&  !(i.DOCUMENT_TYPE_ID == (int) DocumentType.FlashNotes ||
                                                           i.DOCUMENT_TYPE_ID == (int)DocumentType.CallMeetingNotes || 
                                                           i.DOCUMENT_TYPE_ID == (int)DocumentType.OtherNotes || 
                                                           i.DOCUMENT_TYPE_ID == (int)DocumentType.TearSheet);

答案 3 :(得分:-1)

这是一个操作顺序问题。您可以找到有关订购here的更多信息:

doc.canView = IoC.Resolve<IClientAuthorizationService>().Authorize("Put", "ManageDocuments") ==
                                  AuthAccessLevel.Full &&  (i.DOCUMENT_TYPE_ID != (int) DocumentType.FlashNotes &&
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.CallMeetingNotes && 
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.OtherNotes && 
                                                           i.DOCUMENT_TYPE_ID != (int)DocumentType.TearSheet) 
                        ? true // Redundant code but included to show ternary operator
                        : false;