2010-01-20 12 views
7

myślałem, widziałem to wszystko, ale to ... :)C# rodzajowych, porównując 2 ciągi fail chyba że wyraźnie określono

pracowałem na ogólny wykresu typu ciąg,

Graph<string> graph = new Graph<string>(); 

wykres jest zadeklarowana w klasie przymusu jak ten:

public class Graph<T> where T : class 

Następny wypełniam się wykres z niektórych dynamicznie generowanych ciągów:

for (char t = 'A'; t < 'J'; t++) 
{ 
    GraphPrim.Add(t.ToString()); 
} 

Jak dotąd tak dobre, (Node jest klasa wewnętrzna zawierająca oryginalną wartość oraz listę odnośników do innych węzłów (ponieważ jego wykres))

Teraz, gdy próbuję tworzyć relacje między różnymi węzły, muszę wyszukać właściwy węzeł, sprawdzając jego wartość i tam, gdzie zaczyna się dziwność.

Poniższy kod, jest bezpośrednią kopią wyniku znaleźć w immidiate okna po wykonaniu kilku testów:

Nodes.First().Value 
"A" 
Nodes.First().Value == "A" 
false 
Nodes.First().Value.ToString() == "A" 
true 

jestem całkowicie brakuje czegoś lub nie powinien Nodes.First() Wartość ==. "A" używa metody porównywania ciągów znaków. (Kompilator JIT ma wiedzę o typie używanym w środowisku wykonawczym, a wraz z nim jego obsługiwane metody, prawda?). Wydaje mi się, że gdy nie określamy jawnie łańcucha znaków, zrobi to test referencyjny, a nie test łańcuchowy.

Byłoby wspaniale, gdyby ktoś mógłby mi to wyjaśnić,

Z góry dzięki!

+3

Jaki jest statyczny typ właściwości "Wartość"? –

+0

Czy jesteś pewien, że wartość jest zdefiniowana jako: public T Wartość {get; zestaw; } – albertein

Odpowiedz

3

== to metoda statyczna, a zatem nie wirtualna. Wybór metody, której należy użyć, jest wykonywany podczas kompilacji, a nie w czasie wykonywania. W zależności od typu obiektu podczas kompilacji prawdopodobnie wybiera on implementację == dla obiektów, które są porównywane przez odniesienie.

Jeśli zamiast tego używasz wirtualnych metod Equals, będzie to działać zgodnie z oczekiwaniami.

5

Jeśli własność węzły Value jest object operator w

Nodes.First().Value == "A" 

== zrobi porównanie przez odniesienie zamiast porównywania ciągów.

8

Jeśli typy nie są w pełni znane z góry (tzn Value jest znana tylko jako T i nie jest ściśle znany jako string), używać rzeczy jak:

object.Equals(Nodes.First().Value,"A") 

oczywiście można rzucać, ale w tym przypadku potrzebna jest podwójna obsada ((string)(object)), która jest brzydka.

Jeśli wiesz, że oba obiekty są tego samego typu (tj.dwa T wartości), a następnie można użyć:

EqualityComparer<T>.Default.Equals(x,y) 

Zaletą powyższego jest to, że unika boks z kodowanym i podpory podniósł Nullable<T> operatorów i IEquatable<T> oprócz Equals.

Powiązane problemy