Vous ne pouvez pas utiliser var
pour les valeurs de retour ou les types de paramètres (ou les champs). Vous pouvez seulement l'utiliser pour les variables locales.
Eric Lippert a un blog post about why you can't use it for fields. Je ne suis pas sûr s'il y en a un similaire pour les valeurs de retour et les types de paramètres. Les types de paramètres n'ont certainement pas beaucoup de sens - d'où le compilateur pourrait-il déduire le type? Juste quelles méthodes vous essayez d'appeler sur les paramètres? (En fait, c'est à peu près ce que F # fait, mais C# est plus conservateur.)
Ne pas oublier que var
est strictement typage statique - il est juste un moyen d'obtenir le compilateur de déduire le type statique pour vous. C'est toujours juste un seul type, exactement comme si vous aviez tapé le nom dans le code. (Sauf bien sûr avec des types anonymes vous ne pouvez pas faire, ce qui est une motivation pour la fonction.)
EDIT: Pour plus de détails sur var
, vous pouvez télécharger le chapitre 8 de C# en profondeur gratuitement à Manning's site - Ceci inclut la section sur var
. Évidemment, j'espère que vous voudrez ensuite acheter le livre, mais il n'y a pas de pression :)
EDIT: Pour répondre à votre objectif réel, vous pouvez mettre en œuvre presque tout cela avec une méthode générique:
public class MyClass
{
public T Fn<T>(T inValue) where T : struct
{
Comparer<T> comparer = Comparer<T>.Default;
T zero = default(T);
if (comparer.Compare(inValue, zero) < 0)
{
// This is the tricky bit.
return 1.0;
}
else
{
return inValue;
}
}
}
Comme indiqué dans la liste, le bit délicat est de savoir ce que "1" signifie pour un type arbitraire. Vous pouvez coder en dur un ensemble de valeurs, mais c'est un peu moche:
public class MyClass
{
private static readonly Dictionary<Type, object> OneValues
= new Dictionary<Type, object>
{
{ typeof(int), 1 },
{ typeof(long), 1L },
{ typeof(double), 1.0d },
{ typeof(float), 1.0f },
{ typeof(decimal), 1m },
};
public static T Fn<T>(T inValue) where T : struct
{
Comparer<T> comparer = Comparer<T>.Default;
T zero = default(T);
if (comparer.Compare(inValue, zero) < 0)
{
object one;
if (!OneValues.TryGetValue(typeof(T), out one))
{
// Not sure of the best exception to use here
throw new ArgumentException
("Unable to find appropriate 'one' value");
}
return (T) one;
}
else
{
return inValue;
}
}
}
Icky - mais ça va marcher. Ensuite, vous pouvez écrire:
double x = MyClass.Fn(3.5d);
float y = MyClass.Fn(3.5f);
int z = MyClass.Fn(2);
etc
Mes codes peuvent être erronés. J'ai lu quelques articles sur l'utilisation de var dans la portée locale, mais pas dans la bibliothèque comme type var pour les méthodes publiques. Pas sûr puisque je n'ai pas de VS pour le vérifier. –