2016-03-28 1 views
0

私はここ数ヶ月にわたって、試行錯誤やたくさんのgoogle/stackoverflow検索を使ってC#を教えてきましたが、ここで何が起こっているのかは分かりません。私の前回のコーディング経験は、UdacityのCS101コースの3年以上前のことです。これには基本的なPythonが含まれていましたが、そのほとんどはC#を始めた頃には忘れ去られていました。C#なぜ "If(Tuple == Class1.Tuple)"は機能しませんが、 "If(Tuple.Item1 == Class1.Tuple.Item1 && Tuple.Item2 == Class1.Tuple.Item2)"は機能しますか?

class Class1 
{ 
    public Tuple<int, int> StoredLoc = Tuple.Create(12, 6); 
} 

public partial class MainWindow : Window 
{ 
    Class1 Cls1 = new Class1(); 

    private bool CheckLocation(int x, int y) //x = 12, y = 6 
    { 
     Tuple<int, int> loc = Tuple.Create(x, y); 
     //This Does Not work 
     if (loc == Cls1.StoredLoc) 
     { 
      //Do Code 
     } 

     //This Does Work 
     if (loc.Item1 == Cls1.StoredLoc.Item1 && loc.Item2 == Cls1.StoredLoc.Item2) 
     { 
      //Do code 
     } 
    } 
} 

私はここで何が欠けていますか? loc == Cls1.StoredLocはなぜ機能しないのですか?こと、loc.Equals(Cls1.StoredLoc)

+2

参考までに比較します。これはここでは同じではありません。 [値の種類と参照の種類](https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx) – Ben

+0

ちょうど提案: 'System.Windows.Point'または' System.Drawing.Point '(タプルの代わりにあなたが持っているアプリケーションのタイプによって)。 – devuxer

答えて

4

Tuple==ので、それは参照を比較しています

(およびlocCls1.StoredLocので、同じオブジェクトではなく、同じ参照を共有していない、それはfalseを返します)しかし、あなたが使用できるが過負荷になりません(その値が同じであれば、intの場合)の両方のメンバーが等しい場合

Check it in this fiddle

をtrueを返す必要がありますあなたはより多くのフォーマを持つことができます

をobjパラメータは、以下の条件で、現在のインスタンスに等しいと考えられる:

  • それはタプルオブジェクトであり、具体的に、the MSDNEqualsを使用するときにメンバーを比較する方法についてション。

  • 2つのコンポーネントは、現在のインスタンスと同じタイプです。

  • この2つのコンポーネントは、現在のインスタンスのものと同じです。等価性は、各コンポーネントのデフォルトオブジェクト等価比較子によって決定されます。

+0

ええ、私は非常に基本的なことを説明していました...さらに、サンプルコードではOPが目指していると思われる場所*を定義したいときには、「タプル」を使用しない方がいいでしょう。特定の質問にちょうど答えていた:-) – Jcl

+0

十分に公正。私は私のコメントを移動します... – David

+0

@PhatWratは必要ありません、公正なコメントです。私はMSDNへのリンクを追加したので、さらに調査することができます:-) – Jcl

関連する問題