我有一个用 VB.NET 编译的程序集,其中包含两个运算符:
Public Shared Operator =(quarterA As CalendarQuarter, quarterB As CalendarQuarter) As Boolean
Return quarterA.StartDate = quarterB.StartDate AndAlso
quarterA.EndDate = quarterB.EndDate AndAlso
quarterA.Quarter = quarterB.Quarter
End Operator
Public Shared Operator <>(quarterA As CalendarQuarter, quarterB As CalendarQuarter) As Boolean
Return Not (quarterA = quarterB)
End Operator
但是,当使用 C# 中的程序集执行相等性检查时 if (qtr != null)
我收到错误:
无法将类型“object”隐式转换为“bool”
在 C# MVC4、Razor 中的用法:
@{Html.BeginForm();}
<div class="ui-form ui-form-horizontal form-width-narrow">
<div class="title">
Choose a Quarter</div>
<div class="group">
<label><strong>Control</strong></label>
<div class="field">
@Html.DropDownListFor(x => x.Quarter, new SelectList(Model.AvailableQuarters))
<input value="Select" class="ui-button" type="submit" />
</div>
</div>
@if (Model.Quarter != null) {
// Error in the above statement
}
</div>
@{Html.EndForm();}
我需要做什么才能使相等运算符正常运行?
最佳答案
当我按原样实现您的代码并将一个实例与 null 进行比较时,我在您的相等运算符中得到一个 NullReferenceException
。但是,如果我添加空检查,它会正常工作:
Public Shared Operator =(quarterA As CalendarQuarter, quarterB As CalendarQuarter) As Boolean
If quarterA Is Nothing OrElse quarterB Is Nothing Then Return False
Return quarterA.StartDate = quarterB.StartDate AndAlso
quarterA.EndDate = quarterB.EndDate AndAlso
quarterA.Quarter = quarterB.Quarter
End Operator
我怀疑是其他原因导致了您遇到的错误。
当您应该使用相等运算符 (==
) 时,您很可能正在使用赋值运算符 (=
):
if (qtr = null) // wrong - assigning null to qtr
if (qtr == null) // correct
此外,我会推荐overriding Equals
and GetHashCode
与您的相等运算符保持一致。
关于c# - 相等和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370163/