Skip to content

Variant static interface dispatch crashes the runtime #78621

@MichalStrehovsky

Description

@MichalStrehovsky
using System;

Console.WriteLine(GetTheFooString<FooBar, Base>());
Console.WriteLine(GetTheFooString<FooBar, Mid>());
Console.WriteLine(GetTheFooString<FooBar, Derived>());

Console.WriteLine(GetTheBarString<FooBar, Base>());
Console.WriteLine(GetTheBarString<FooBar, Mid>());
Console.WriteLine(GetTheBarString<FooBar, Derived>());

Console.WriteLine(GetTheFooString<FooBarBaz, Base>());
Console.WriteLine(GetTheFooString<FooBarBaz, Mid>());
Console.WriteLine(GetTheFooString<FooBarBaz, Derived>());

Console.WriteLine(GetTheBarString<FooBarBaz, Base>());
Console.WriteLine(GetTheBarString<FooBarBaz, Mid>());
Console.WriteLine(GetTheBarString<FooBarBaz, Derived>());


static string GetTheFooString<T, U>() where T : IFoo<U> => T.GetString();
static string GetTheBarString<T, U>() where T : IBar<U> => T.GetString();

interface IFoo<in T> { static virtual string GetString() => $"IFoo<{typeof(T).Name}>"; };
interface IBar<out T> { static virtual string GetString() => $"IBar<{typeof(T).Name}>"; };
class FooBar : IFoo<Base>, IBar<Derived> { }

interface IBaz : IFoo<Mid>, IBar<Mid>
{
    static string IFoo<Mid>.GetString() => "IBaz";
    static string IBar<Mid>.GetString() => "IBaz";
}
class FooBarBaz : FooBar, IBaz { }

class Base { }
class Mid : Base { }
class Derived : Mid { }

Expected

Doesn't crash

Actual

IFoo<Base>
IFoo<Base>
IFoo<Base>
IBar<Derived>
IBar<Derived>
IBar<Derived>
IFoo<Base>
Fatal error. Internal CLR error. (0x80131506)
   at Program.<<Main>$>g__GetTheFooString|0_0[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]()
   at Program.<Main>$(System.String[])

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions