Vb guys always wonder why c# has no identity equality operator like Is and IsNot. In many cases equality operator == make the job in c#. For instance
object d = "hello!";
bool isString = typeof(string) == d.GetType();
Here is the code in vb.net
Dim d As Object = "hello!"
Dim isString As Boolean = GetType(string) Is d.GetType()
'below is regular language construction
Dim isType As Boolean = GetType(string) Is d
The last statement will not work in c#. The only chance is to use ReferenceEquals method
object d = "hello!";
bool isType = ReferenceEquals(typeof(string), d);
So far so good. The bad news is expressions lack of identity equality operator. There is only one enumeration element in ExpressionType enum represents equality - ExpressionType.Equal. Even in CodeDom there are three: IdentityInequality, IdentityEquality and ValueEquality. So if you want to transform Expressions tree to CodeDom tree like I do, you have to think a lot.
In Expressions to CodeDom I create spesial CodeIdentityEqualityExpression class and CodeDom.Is method to simplify usage.
<TestMethod()> Public Sub TestIsOperator()
Dim c = New CodeDomGenerator()
c.AddNamespace("Samples").AddClass("cls") _
.AddMethod(MemberAttributes.Public Or MemberAttributes.Static, Function() "foo", _
Emit.declare("d1", Function() CodeDom.Is(String.Empty, GetType(String))), _
Emit.declare("d2", Function() CodeDom.IsNot(String.Empty, GetType(String))) _
)
Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp))
Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB))
Dim ass = c.Compile()
Assert.IsNotNull(ass)
Dim TestClass As Type = ass.GetType("Samples.cls")
Assert.IsNotNull(TestClass)
End Sub