2013-03-04 42 views
38

Tôi đang cố gắng so sánh hai cấu trúc bằng cách sử dụng bằng (==) trong C#. struct của tôi là dưới đây:So sánh hai cấu trúc bằng cách sử dụng ==

public struct CisSettings : IEquatable<CisSettings> 
{ 
    public int Gain { get; private set; } 
    public int Offset { get; private set; } 
    public int Bright { get; private set; } 
    public int Contrast { get; private set; } 

    public CisSettings(int gain, int offset, int bright, int contrast) : this() 
    { 
     Gain = gain; 
     Offset = offset; 
     Bright = bright; 
     Contrast = contrast; 
    } 

    public bool Equals(CisSettings other) 
    { 
     return Equals(other, this); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
     { 
      return false; 
     } 

     var objectToCompareWith = (CisSettings) obj; 

     return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast && 
       objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset; 

    } 

    public override int GetHashCode() 
    { 
     var calculation = Gain + Offset + Bright + Contrast; 
     return calculation.GetHashCode(); 
    } 
} 

Tôi cố gắng để có cấu trúc như một tài sản trong lớp học của tôi, và muốn kiểm tra xem nếu struct bằng với giá trị Tôi cố gắng để gán nó vào, trước khi tôi đi trước và làm như vậy, vì vậy tôi không chỉ sở hữu đã thay đổi khi nó không có, như vậy:

public CisSettings TopCisSettings 
{ 
    get { return _topCisSettings; } 
    set 
    { 
     if (_topCisSettings == value) 
     { 
      return; 
     } 
     _topCisSettings = value; 
     OnPropertyChanged("TopCisSettings"); 
    } 
} 

Tuy nhiên, trên đường, nơi tôi kiểm tra cho bình đẳng, tôi nhận được lỗi này:

Operator '==' cannot be applied to operands of type 'CisSettings' and 'CisSettings'

Tôi không thể hiểu tại sao đây là xảy ra, ai đó có thể chỉ cho tôi đi đúng hướng?

+0

Làm thế nào về sử dụng 'Equals()'? –

+0

Bằng cách hoạt động tốt, chỉ cần tự hỏi tại sao ghi đè của tôi == không hoạt động – JMK

+3

@JMK, có thể vì bạn không ghi đè lên ... :) – gdoron

Trả lời

63

Bạn cần phải quá tải các toán tử ==!=. Thêm phần này vào struct của bạn:

public static bool operator ==(CisSettings c1, CisSettings c2) 
{ 
    return c1.Equals(c2); 
} 

public static bool operator !=(CisSettings c1, CisSettings c2) 
{ 
    return !c1.Equals(c2); 
} 
+0

Tôi là một thằng ngốc , bạn là người đầu tiên để bạn nhận được câu trả lời tốt nhất! – JMK

+0

thx - bạn gần như ở đó. –

+2

@JMK, Thực ra tôi là người đầu tiên, nhưng tôi rất tuyệt với nó. :) – gdoron

1

Bạn nên quá tải nhà điều hành của bạn là một số cách như thế này:

public static bool operator ==(CisSettings a, CisSettings b) 
{ 
    return a.Equals(b); 
} 
1

Bạn cần phải ghi đè toán tử == một cách rõ ràng.

public static bool operator ==(CisSettings x, CisSettings y) 
{ 
    return x.Equals(y); 
} 

Bằng cách này, bạn nên đặt mã so sánh trong public bool Equals(CisSettings other), và để cho bool Equals(object obj) gọi bool Equals(CisSettings other), vì vậy mà bạn có thể đạt được một số hiệu suất bằng cách tránh kiểm tra loại không cần thiết.

Các vấn đề liên quan