Suppose I have three methods:
void Foo(MemoryStream v) {Console.WriteLine ("MemoryStream");}
void Foo(Stream v) {Console.WriteLine ("Stream");}
void Foo(object v) {Console.WriteLine ("object");}
I call method Foo passing first parameter of open generic type:
void Bar<T>()
{
Foo(default(T)); //just to show the scenario
//default(T) or new T() doesn't make a difference, null is irrelevant here
}
I want to call MemoryStream overload, so I close generic type of method Bar with MemoryStream:
Bar<MemoryStream>();
but the object overload is called. If I add generic constraint to Foo signature where T : Stream, then the Stream version is called.
Is there a way to dispatch method call to MemoryStream overload, based on open generic type T?
I don't want to use Delegate.CreateDelegate or other Reflection APIs. Just in the means of C# language. I'm probably missing something within the language itself.
Tried this scenario with value types as closed generic type and using static methods.