Ce ne est pas possible créer une telle restriction. Vous devriez vérifier l'entrée à l'exécution et lancer un message d'erreur d'exception utile.
Vous pouvez cependant faire quelque chose comme:
public interface IWellKnown
{
int PropertyA { get; }
int PropertyB { get; }
}
public abstract class WellKnownBase<T> : IWellKnown
{
IWellKnown.PropertyA { get { return Convert(this.PropertyA); } }
IWellKnown.PropertyB { get { return Convert(this.PropertyB); } }
public T PropertyA { get; }
public T PropertyA { get; }
protected virtual int Convert(T input) { return (int)input; }
}
En utilisant une telle classe de base guides d'une mise en œuvre d'une version concrète de fournir un moyen de jeter à int
. L'implémentation d'interface explicite donne accès à des accesseurs typés int
tandis que la classe "real" fournit toujours le type d'origine.
public class WellKnownFloat : WellKnownBase<Float> {}
Vous obtiendriez une classe pour float. Si le type ne peut être converti int vous pouvez fournir un convertisseur de mesure:
public class WellKnownTimeSpan : WellKnownBase<TimeSpan>
{
protected override int Convert(TimeSpan input)
{
return (int)input.TotalMilliseconds;
}
}
Soit dit en passant, en utilisant LINQ et en ajoutant l'exigence de l'interface, vous pouvez réécrire votre fonction input.Select(x => x.PropertyA + x.PropertyB)).ToArray()
. PS: s'il vous plaît vérifier le code en utilisant VisualStudio, je l'écris juste hors de ma tête sans support du compilateur;) Il peut y avoir de petites erreurs compiletime.
Oui, vous avez raison, mais que se passe-t-il si j'ai besoin que ces propriétés soient généralement numériques, pas nécessairement des entiers. J'ai mal posé la question, désolé. Mais merci pour votre réponse de toute façon. – NumberFour