4 votes

Opérateurs d'égalité et d'assignation

J'ai un assemblage compilé en VB.NET qui contient deux opérateurs :

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

Cependant, lorsqu'on utilise l'assemblage en C# pour effectuer des contrôles d'égalité if (qtr != null) Je reçois l'erreur :

Cannot implicitly convert type 'object' to 'bool'

Utilisation en 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();}

Que dois-je faire pour que l'opérateur d'égalité se comporte correctement ?

3voto

D Stanley Points 54768

Lorsque j'applique votre code tel quel et que je compare une instance à null, j'obtiens un message d'erreur. NullReferenceException dans votre opérateur d'égalité. Cependant, si j'ajoute un contrôle de nullité, cela fonctionne bien :

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

Je pense que quelque chose d'autre cause l'erreur que vous obtenez.

Vous utilisez probablement l'opérateur d'affectation ( = ) alors que vous devriez utiliser l'opérateur d'égalité ( == ) :

if (qtr = null)   // wrong  - assigning null to qtr
if (qtr == null)  // correct

En outre, je recommande Remplacement de Equals y GetHashCode pour être cohérent avec votre opérateur d'égalité.

0voto

LMB Points 696

Vous ne pouvez pas surcharger les opérateurs d'affectation, ni en VB ni en C#.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X