2016-04-25 15 views
6

che sto cercando di risolvere CA2225, che mette in guardia sul ContrainedValue<T> di sotto, con il seguente messaggio: Provide a method named 'ToXXX' or 'FromXXX' as an alternate for operator 'ConstrainedValue<T>.implicit operator T(ConstrainedValue<T>)'.Come risolvere CA2225 (OperatorOverloadsHaveNamedAlternates) quando si utilizza classe generica

Ho anche incollato PositiveInteger per illustrare un caso d'uso per ConstrainedValue<T>. ConstrainedValue<T> consente alle derivate di specificare semplicemente il vincolo applicato a un tipo di valore, nel costruttore. Sembra un modo abbastanza pulito per codificarlo. C'è un modo per risolvere l'avviso CA2225, dato che ho a che fare con un tipo generico? Come posso fornire un operatore alternativo?

  • Forse potrei implementare ToInt, ToDouble, ecc per tutti i tipi di valore e li hanno gettano se il from non è dello stesso tipo? Ma penso che sia una brutta pratica avere il metodo ToXXX?
  • È possibile creare un livello compreso tra ConstrainedValue<T> e PositiveInteger<T>, una classe ConstrainedInteger. Potrei inserire ToInt() in quella classe. Ma sembra sbagliato creare un layer semplicemente per soddisfare CA2225 e non penso che l'avvertimento andrebbe via su ConstrainedValue<T> e dovrei sopprimere questo avviso.

Codice:

namespace OBeautifulCode.AutoFakeItEasy 
{ 
    using System.Diagnostics; 

    using Conditions; 

    /// <summary> 
    /// Represents a constrained value. 
    /// </summary> 
    /// <typeparam name="T">The type of the constrained value.</typeparam> 
    [DebuggerDisplay("{Value}")] 
    public abstract class ConstrainedValue<T> 
     where T : struct 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="ConstrainedValue{T}"/> class. 
     /// </summary> 
     /// <param name="value">The value of the <see cref="ConstrainedValue{T}"/> instance.</param> 
     protected ConstrainedValue(T value) 
     { 
      this.Value = value; 
     } 

     /// <summary> 
     /// Gets the underlying value of the instance. 
     /// </summary> 
     public T Value { get; } 

     /// <summary> 
     /// Performs an implicit conversion from <see cref="ConstrainedValue{T}"/> to the underlying value type. 
     /// </summary> 
     /// <param name="from">The <see cref="ConstrainedValue{T}"/> to convert from.</param> 
     /// <returns> 
     /// The result of the conversion. 
     /// </returns> 
     public static implicit operator T(ConstrainedValue<T> from) 
     { 
      return from.Value; 
     }    
    } 

    /// <summary> 
    /// Represents a positive integer. 
    /// </summary> 
    [DebuggerDisplay("{Value}")] 
    public sealed class PositiveInteger : ConstrainedValue<int> 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="PositiveInteger"/> class. 
     /// </summary> 
     /// <param name="value">The value held by the <see cref="PositiveInteger"/> instance.</param> 
     public PositiveInteger(int value) 
      : base(value) 
     { 
      Condition.Requires(value, nameof(value)).IsGreaterThan(0); 
     } 
    } 
} 

risposta

3

È possibile effettuare l'analisi del codice felici effettivamente facendo quello che dice:

Inserire questo ConstrainedValue<T> e l'avviso andrà via.

public T ToT() 
{ 
    return this.Value; 
} 

Personalmente, preferirei sopprimere il messaggio, che già forniscono un metodo per ottenere il valore, anche se la lingua non fornisce casting.

+0

Strano ... In realtà ho provato questo e l'avviso è rimasto, ma un riavvio di VS e una ricostruzione lo ha risolto! Ad ogni modo, penso che sopprimere l'avvertimento sia sicuramente meglio di 'ToT()', che è probabile che sia fonte di confusione per un utente finale. Grazie per la risposta! Terrò la domanda aperta per altre idee. Vorrei fornire operatori leggibili e alternativi come ToInt, ToDouble, ecc. Perché sembra una buona pratica, ma non sono sicuro di quale sia il modo migliore per implementarlo. Forse non importa davvero. – SFun28

+0

Suppongo di poter implementare 'ToT()', creare un 'ConstrainedInteger' che deriva da' ConstrainedValue' e implementare un 'ToInt' che richiama semplicemente' ToT() 'e quindi deriva' PositiveInteger' da 'ConstrainedInteger' – SFun28

+0

Realmente , l'approccio con risposta non funziona completamente. Genera 'CA1000 - Non dichiarare membri statici su tipi generici'. LOL! – SFun28

Problemi correlati