2012-11-13 81 views
4

我有一個包含兩個運營商在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,剃刀:

@{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();} 

我需要做些什麼來使相等運算符正常運行?

+1

你爲什麼在談論轉讓?您的代碼不包含任何分配。也不可能超載分配。 – CodesInChaos

+0

你能否給出一個簡短但完整的例子(VB和C#)來演示這個問題? –

+0

@CodesInChaos,你是對的。我再次通過了代碼,並將它誤認爲是另一個無關的位。感謝您指出了這一點。 –

回答

3

當我按原樣實現代碼並將實例與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要與你平等的運營商是一致的。

+0

是的,就是這樣。運營商的空檢查是必要的。奇怪的是,在向運算符添加null檢查之後,再次刪除它以驗證其效果之後,我開始接收NullReferenceException,就像您一樣。不知道我之前是如何獲得類型轉換錯誤的,但現在已經消失了。謝謝! –

+0

經過一些進一步的測試後,它看起來像我還需要在操作符中的空檢查之前包含'如果quarterA是Nothing並且quarterB是Nothing然後返回True'。 –