Erreur CS0029 Impossible de convertir implicitement le type 'string' en 'String'

joel descombes 5 Points de réputation
2024-02-06T22:01:07.9866667+00:00

Hello, J'utilise VisualStudio 2022 et .NET 8.0 (mais le problème est le même avec .NET 6.0 ou .NET 7.0). Le code ci-dessous génère l'erreur CS0029 Impossible de convertir implicitement le type 'string' en 'String', au niveau de k.Name.
Si je remplace String par string dans la définition de la méthode, j'obtiens les erreurs suivantes au niveau de la signature de la méthode d'implémentation de GetKeySelector:
CS1001: Identificateur attendu
CS1003: Erreur de syntaxe, '>' attendu
CS1003: Erreur de syntaxe, ')' attendu Où se trouve le problème?

public record class DataA 
{
    public int Id { get; set; }
    public String Name { get; set; } = string.Empty;
	public string? Description { get; set; }
}

public interface IMyClass
{
}

public interface IMyClass<T> : IMyClass where T : class 
{
}

public abstract class MyClass<T> : IMyClass<T>  where T : class, new()
{
	public abstract Func<T, key> GetKeySelector<key>();
}

public class MyClassB : MyClass<DataA>
{
	public override Func<DataA, String> GetKeySelector<String>()
        { return new Func<DataA, String>(k => k.Name); }
}
Visual Studio
Visual Studio
Famille de suites Microsoft d’outils de développement intégrés pour la création d’applications pour Windows, le web et les appareils mobiles.
15 questions
C#
C#
Langage de programmation orienté objet et sécurisé au niveau des types, qui prend ses racines dans la famille des langages C et inclut la prise en charge de la programmation orientée vers les composants.
10 questions
0 commentaires Aucun commentaire
{count} votes

3 réponses

Trier par : Le plus utile
  1. joel descombes 5 Points de réputation
    2024-02-08T21:56:09.5033333+00:00

    C'est bon. J'ai trouvé une alternative.
    Je modifie la classe abstraite MyClass et la signature de la méthode GetKeySelector, comme ci-dessous. Dès lors, je peux caster string en String et les messages d'erreurs disparaissent. Un peu tordu tout de même.

    
    public abstract class MyClass<T, key> : IMyClass<T>  where T : class, new()
    {
    	public abstract Func<T, key> GetKeySelector();
    }
    
    public class MyClassB : MyClass<DataA, string>
    {
    	public override Func<DataA, String> GetKeySelector()
            { return new Func<DataA, String>(k => k.Name); }
    }
    
    1 personne a trouvé cette réponse utile.

  2. Omar Kefi (Convergys Corporation) 340 Points de réputation Fournisseur Microsoft
    2024-02-07T19:51:55.2266667+00:00

    Bonjour , Merci d'avoir sollicité la communauté Q&A France.

    merci de voir cette article.

    Erreur du compilateur CS0029

    Cordialement,

    Omar,Si cette réponse a répondu à votre question, veuillez « Accepter comme réponse » et voter en utilisant « Pouce levé » afin que la pertinence de ce message s’améliore lorsque quelqu’un dans la communauté recherche une requête similaire.


  3. Alexis Thorez (CONCENTRIX CORPORATION) 5 425 Points de réputation Fournisseur Microsoft
    2024-02-15T11:08:42.9033333+00:00

    Sujet solutionné par @joel descombes

    C'est bon. J'ai trouvé une alternative.

    Je modifie la classe abstraite MyClass et la signature de la méthode GetKeySelector, comme ci-dessous. Dès lors, je peux caster string en String et les messages d'erreurs disparaissent. Un peu tordu tout de même.

    public abstract class MyClass<T, key> : IMyClass<T>  where T : class, new()
    {
    	public abstract Func<T, key> GetKeySelector();
    }
    
    public class MyClassB : MyClass<DataA, string>
    {
    	public override Func<DataA, String> GetKeySelector()
            { return new Func<DataA, String>(k => k.Name); }
    }