== Why is this an issue?

Numbers can be shifted with the `<<` and `>>` https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#left-shift-operator-[operators], but the right operand of the operation needs to be an `int` or a type that has an https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#102-implicit-conversions[implicit conversion] to `int`. However, when the left operand is https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/interop/using-type-dynamic[dynamic], the compiler's type checking is turned off, so you can pass anything to the right of a shift operator and have it compile. And if the argument can't be implicitly converted to `int` at runtime, then a https://learn.microsoft.com/en-us/dotnet/api/microsoft.csharp.runtimebinder.runtimebinderexception[RuntimeBinderException] will be raised.

[source,csharp]
----
dynamic d = 5;
var x = d >> 5.4;   // Noncompliant
x = d << null;      // Noncompliant
x <<= new object(); // Noncompliant
----

== Resources

=== Documentation

* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#left-shift-operator-[Shift Operators]
* https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#102-implicit-conversions[Implicit Conversions]
* https://learn.microsoft.com/en-us/dotnet/api/microsoft.csharp.runtimebinder.runtimebinderexception[RuntimeBinderException Class]
* https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/interop/using-type-dynamic[Using type dynamic]

include::../rspecator-dotnet.adoc[]
