2012-01-09 13 views
3

私は何を書こうとしているのか、最初に明確にすべきだと思います。達成したいことではありません。それは私に起こったことであり、私はそれが可能であることを理解しようとしているので、私はそれを修正することができます。だからここで私たちは行く...変数は同時に2つの値を持つことができますか?

私はC#、.Net 4.0を使用しています。コードは大きすぎて、大きすぎるので、ここでそれを過ぎてしまいましたが、私は何が起こるかを説明しようと思っています。

私の呼び出しスタックでは、一連の一般的なメソッドがありますが、値が一方から他方に変化するだけであることに気付きました。それは私の第一印象でした。後で私は、私が私がオブジェクトの同じプロパティに対して2つの異なる値を見ることができる問題のある方法を分離することができました。今、私はその一般的な方法で停止し、のサンプル型の可変データを見ると、私はそのプロパティを拡張することができますBaseClassのとISomeINterface両方が

public Guid Id 

を定義することは重要であるかもしれないもの

public class Sample : BaseClass, ISomeInterface 
{ 
    [XmlIgnore] 
    public new Guid Id { get; set; } 
} 

Idの最初の値を参照してください。しかし、私がのデータを見ると、は違う値を示しています。あなた自身を見てください。

(ここでは、私が原因無視できる評判に投稿することはできません絵でした申し訳ありません。)

編集:私はそこに任意の体がどのようにそれらの値の差が何であるかを知っているだろうがhttp://picturepush.com/public/7307446

それをプッシュ時計窓が得られますか?違いはなんですか?私は多くの異なったアプローチを試みましたが、反射を使ってみましたが、常にのデータを見ると同じ値になります。と皮肉なことに、正しい値、私が期待しているのはもう一方です。

ああ、いや、それは宿題ではありません。)

+0

public class BaseClass : ISomeInterface { public virtual Guid Id { get; set; } } 

そしてSampleでそれをオーバーライドします。

は、仮想へBaseClassIdプロパティを設定します。 – gdoron

+0

BaseClassの外観は何ですか?値を確認すると、SampleクラスインスタンスがSampleクラスまたはBaseClassとしてキャストされていますか? –

+0

プロパティはDebuggerDisplayAttributeで修飾されていますか?デバッガでオブジェクトを展開するときに表示されるものとは異なる値を表示することができます。 –

答えて

5

newキーワードは、基本クラスのメンバーを隠しています。 、どこか別の場所に画像をアップロードしてください

public class Sample : BaseClass, ISomeInterface 
{ 
    public override Guid Id { get; set; } 
} 
+0

これで解決しました。私は、隠蔽がどのように開発者にとって混乱を招くかを理解できますが、それは理由があるため、プロパティを定義(または再定義)する必要があることがあります。しかし、ここでは、デバッガ/コンパイラ/ .Net_frameworkも混乱しているようですが、言語の '機能'です。 – michal

2

SampleクラスでIdプロパティを定義しないでください。 BaseClassから継承してください。上記のコードを使用すると、基本クラスと実際のクラスの両方のidを定義しているときSample.IdがBaseClass.Id

+1

そのIDの前に新しいものがあります。私はそれをベースクラスにない属性で装飾できるようにする必要があります。 – michal

+0

あなたはそうです。私は 'new'キーワードを見逃しました。しかし、これはあなたの問題の原因です。コードに 'BaseClass'タイプの参照がある場合、BaseClassに定義されているIdが表示されます。参照の型が 'Sample'の場合は、新しいものが表示されます。基本クラスを変更できない場合は、使用するたびに 'Sample'型の参照を扱うようにする必要があります。 –

+0

あなたのご意見ありがとうございます。確かに隠れているのは問題の原因だったが、そのような概念は(私にとっては)よく分かっている。実際の問題と混乱の原因は、1つの方法でしか起こらなかった理由と、デバッガが同時に2つの値を表示していた理由です。とにかく、それは今解決されました。隠すのではなくオーバーライドが助けになりました。 – michal

3

を隠しているコンパイラの警告を生成する必要があり、2番目の定義は、最初に上書きされていないが、を隠して。つまり、Sampleクラスには実際に両方の定義が含まれており、アクセスする変数の静的型に依存します。したがって

Sample s = new Sample(); 
BaseClass b = (BaseClass)s; 
s.Id != b.Id; 

これは何をしたい一般的ではなく、あなたがこれを示し:)

簡単なコンパイル可能たとえば、すでに出て発見したとして、非常に奇妙な行動につながることができます:

class A { 
    public int val = 5; 

    public static void Main(string[] args) { 
     B b = new B(); 
     A a = (A)b; 
     Console.WriteLine(a.val); // 5 
     Console.WriteLine(b.val); // 10 
    } 
} 

class B : A { 
    public int val = 10; 
} 

この混乱があり、正しく修正できない場合は、静的タイプをアクセスしたいバージョンにキャストできます。

+0

私はそれについて考えて、階層内のすべての型に無駄にキャストしようとしました。あなたの例では、2つの変数は明らかに2つの異なるタイプです。私がアップロードした画像を見てください。同じ瞬間に1つのタイプの変数について話しています。 – michal

関連する問題