dotnet/roslyn

CS compiler accepts contradicting signature and fails to accept exact signature when overriding a generic abstract method

Open

#76 914 ouverte le 24 janv. 2025

Voir sur GitHub
 (7 commentaires) (0 réactions) (0 assignés)C# (4 257 forks)batch import
Area-CompilersConcept-Diagnostic ClarityFeature - Nullable Reference Typeshelp wanted

Métriques du dépôt

Stars
 (20 414 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (256 PRs mergées en 30 j)

Description

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.

Guide contributeur