dotnet/roslyn
GitHub で見るCS compiler accepts contradicting signature and fails to accept exact signature when overriding a generic abstract method
Open
#76,914 opened on 2025年1月24日
Area-CompilersConcept-Diagnostic ClarityFeature - Nullable Reference Typeshelp wanted
Repository metrics
- Stars
- (20,414 stars)
- PR merge metrics
- (平均マージ 6d 17h) (30d で 256 merged PRs)
説明
This compiles:
#nullable enable
using System;
namespace Demo
{
public interface ITest
{
public bool TryGet<T>(out T? result) where T : notnull;
}
public abstract class MyAbstractClass : ITest
{
public abstract bool TryGet<T>(out T? result) where T : notnull;
}
public class MyDerivedClass : MyAbstractClass
{
public override bool TryGet<T>(out T result)
{
throw new Exception("");
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
}
}
This fails:
#nullable enable
using System;
namespace Demo
{
public interface ITest
{
public bool TryGet<T>(out T? result) where T : notnull;
}
public abstract class MyAbstractClass : ITest
{
public abstract bool TryGet<T>(out T? result) where T : notnull;
}
public class MyDerivedClass : MyAbstractClass
{
public override bool TryGet<T>(out T? result)
{
throw new Exception("");
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
}
}
public override bool TryGet<T>(out T result) signature, the one the compiler is happy to accept, contradicts both inherited definitions while it rejects public override bool TryGet<T>(out T? result) which is exactly the same as in parents.