NeVeSpl / NTypewriter

File/code generator using Scriban text templates populated with C# code metadata from Roslyn API.
https://nevespl.github.io/NTypewriter/
MIT License
126 stars 24 forks source link

Generic class with itself as argument of base type equality problem #119

Open Xriuk opened 5 months ago

Xriuk commented 5 months ago

Hello, I don't know if I'm missing something here (about your library or Roslyn), but until know I had compared all class types by equality:

classType1 = // some code which returns IClass

classType2 = // some other code which returns IClass

if classType1 == classType2
    }} same {{
end

However if I have a class like this in C#:

public class Base<T>{}

public class Derived : Base<Derived>{}

This does not work:

classType = // some code which returns IClass = Derived

if classType.BaseType.IsGeneric && classType.BaseType.TypeArguments[0] == classType
    }} same {{
end

So apparently Derived and its parent generic argument Derived are different types, why?

NeVeSpl commented 5 months ago

It is on NTypewriter side, the equality operator is not overridden, so standard reference comparison is used, and since an instance of object representing a given type is not cached, the results are exactly as you described.

Xriuk commented 5 months ago

Oh, so types are not cached like System.Type? Is there an alternative to compare two given types?

NeVeSpl commented 5 months ago

They are not, probably only by using their FullName right now.