【问题标题】:Equality and Assignment Operators等式和赋值运算符
【发布时间】:2012-11-02 10:30:39
【问题描述】:

我有一个用 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) 时,我收到错误:

Cannot implicitly convert type 'object' to '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();}

我需要做什么才能使相等运算符正常运行?

【问题讨论】:

  • 你为什么要谈作业?您的代码不包含任何分配。也不能重载赋值。
  • 您能否给出一个简短但完整的示例(VB 和C#)来说明问题?
  • @CodesInChaos,你是对的。我再次检查了代码,并把它误认为是另一个不相关的位。感谢您指出这一点。

标签: c# vb.net operators


【解决方案1】:

当我按原样实现您的代码并将实例与 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 与您的相等运算符保持一致。

【讨论】:

  • 是的,就是这样。需要在运算符中进行空检查。奇怪的是,在将 null 检查添加到运算符之后,然后再次将其删除以验证其效果,我开始像您一样收到 NullReferenceException。不知道我之前是如何得到类型转换错误的,但现在它已经消失了。谢谢!
  • 经过进一步的测试,看起来我还需要在运算符中的 null 检查之前包含If quarterA Is Nothing And quarterB Is Nothing Then Return True
【解决方案2】:

您不能重载赋值运算符,无论是在 VB 还是 C# 中。

http://msdn.microsoft.com/en-us/library/8edha89s.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 2011-07-17
    • 1970-01-01
    • 2013-06-28
    • 2013-04-11
    • 2015-03-19
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多