2015-11-30 1 views
0

J'ai du code qui crée une valeur typée à partir d'une représentation sous forme de chaîne. Ce code gère les types de valeurs, des classes, des tableaux, etc.La compilation échoue avec l'erreur CS0452 sous VS 2015

Malheureusement, après mise à niveau vers VS 2015 résultats d'analyse de code cette erreur lors de la compilation:

CS0452 Le type 'T' doit être un type de référence pour pour l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'Foo.Bar (chaîne)'

Cette erreur ne s'est pas produite sous VS 2012 ou 2013 et le code a été compilé et a fonctionné correctement.

ProfileValue.Value est de type String. En CreateValue, T peut être un type de valeur, classe, etc.

Indicatif téléphonique:

private static T CreateValue<T>(ProfileValue profileValue) 
{ 
    // setup code 
    if (typeof(T) == typeof(String)) 
    { 
     // handle strings specially 
    } 
    else if (typeof(T).IsArray) 
    { 
     // handle arrays specially 
    } 
    else if (typeof(T).IsClass) 
    { 
     return Foo.Bar<T>(profileValue.Value); // <-- error occurs here 
    } 
    // additional cases 
} 

signature Appelée méthode:

public class Foo 
{ 
    public static T Bar<T>(String value) where T : class, new() 
    { 
     // do something 
    } 
} 

Cette passé analyse de code dans VS 2013 et fonctionne très bien . Que puis-je faire pour résoudre la nouvelle erreur d'analyse de code VS 2015?

+1

code que vous avez show est invalide et ne peut pas être compilé avec C# 5.0 également. Vous ne savez pas pourquoi vous pensez que 'Foo.Bar ' peut être compilé sans 'où T: class' sur la méthode' CreateValue '. –

+0

Que voulez-vous dire par "nouveau CS0452"? L'erreur n'est pas nouvelle à VS2015, et est une véritable erreur de compilation, pas "analyse de code". Voulez-vous dire que c'est juste "nouveau" pour votre code? Je ne vois rien dans votre code qui suggère que cela aurait jamais fonctionné. Avec la contrainte sur 'Bar ()', tous les appelants ont besoin d'une contrainte similaire s'ils sont génériques (et sinon, ils doivent passer un type de référence avec un constructeur sans paramètre). Change 'CreateValue (ProfileValue profileValue)' à 'CreateValue (ProfileValue profileValue) où T: class, new()' –

+0

@PeterDuniho Je voulais dire nouveau à mon code. J'ai légèrement modifié le titre et le corps de la question pour refléter cela. – joshjeppson

Répondre