4

2 つの演算子を含む 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();}

等値演算子を適切に動作させるにはどうすればよいですか?

4

2 に答える 2

3

コードをそのまま実装し、インスタンスを null と比較するとNullReferenceException、等値演算子が得られます。ただし、null チェックを追加すると、正常に動作します。

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

さらに、オーバーライドEqualsGetHashCodeて等値演算子と一致させることをお勧めします。

于 2012-11-13T22:51:46.643 に答える
0

VB でも C# でも、代入演算子をオーバーロードすることはできません。

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

于 2012-11-13T23:00:50.203 に答える