c# - 相等和赋值运算符

标签 c# vb.net operators

我有一个用 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/

相关文章:

c# - 相当于 C# 中 C++ 的 sizeof(uint64Array) 吗?

vb.net - 如何在 VB.NET 中使用 "Into"LINQ 表达式?

c++ - 使用 operator+ 而不会泄漏内存?

.net - 如何比较两个字符串列表以找到相同的字符串

c++ - 为什么存储在 STL 容器中的类禁止重载 operator&()?

list - 如何可靠地比较列表的整数或浮点值?

c# - 达到 DateTime 后执行方法的最有效方法

c# - 使用保留字(类型名称)作为 ExpandoObject 或 Dynamic 属性

c# - 在 C# 中,如何将 Intellisense 添加到 DataGridView 单元格?

.net - 在(据称)高性能代码中使用 GetCurrentMethod