2016-04-25 10 views
6

का उपयोग कर रहा CA2225, जो नीचे ContrainedValue<T> पर चेतावनी दी है हल करने के लिए कोशिश कर रहा हूँ, निम्न संदेश के साथ CA2225 (OperatorOverloadsHaveNamedAlternates) ठीक करने के लिए कैसे: Provide a method named 'ToXXX' or 'FromXXX' as an alternate for operator 'ConstrainedValue<T>.implicit operator T(ConstrainedValue<T>)'.जब सामान्य वर्ग

मैं भी PositiveInteger चिपकाया है एक यूज़-केस वर्णन करने के लिए ConstrainedValue<T> के लिए। ConstrainedValue<T> डेरिवेटिव को कन्स्ट्रक्टर में किसी मान प्रकार पर लागू होने वाली बाधा को निर्दिष्ट करने में सक्षम बनाता है। यह इस कोड को कोड करने के लिए एक बहुत साफ तरीका लगता है। सीए 2225 चेतावनी को हल करने का कोई तरीका है, बशर्ते कि मैं एक सामान्य प्रकार से निपट रहा हूं? मैं एक वैकल्पिक ऑपरेटर कैसे प्रदान कर सकता हूं?

  • शायद मैं ToInt, ToDouble, सभी प्रकार के लिए मूल्य आदि को लागू करने और उन्हें फेंक अगर from एक ही प्रकार की नहीं है हो सकता था? लेकिन मुझे लगता है कि ToXXX विधि फेंकना एक बुरा अभ्यास है?
  • मैं ConstrainedValue<T> और PositiveInteger<T>, ConstrainedInteger कक्षा के बीच में एक परत बना सकता था। मैं उस कक्षा में ToInt() डाल सकता था। लेकिन सीए 2225 को संतुष्ट करने के लिए बस एक परत बनाने में गलत लगता है और मुझे नहीं लगता कि चेतावनी ConstrainedValue<T> पर चली जाएगी और मुझे उस चेतावनी को दबाना होगा।

कोड: ConstrainedValue<T> में

सम्मिलित इस और चेतावनी दूर जाना होगा:

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); 
     } 
    } 
} 

उत्तर

3

आप कोड विश्लेषण वास्तव में कर रही है कि वह क्या कहते हैं से खुश कर सकते हैं।

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

व्यक्तिगत रूप से, मैं नहीं बल्कि संदेश को दबाने के हैं, तो आप पहले से ही मूल्य है, भले ही भाषा कास्टिंग प्रदान नहीं करता है पाने के लिए एक विधि प्रदान करते हैं।

+0

अजीब ... मैंने वास्तव में यह कोशिश की और चेतावनी बनी रही, लेकिन वीएस की पुन: शुरूआत और एक पुनर्निर्माण ने इसे ठीक कर दिया! वैसे भी, मुझे लगता है कि चेतावनी दबाने से 'TOT()' की तुलना में निश्चित रूप से बेहतर होता है, जो अंत उपयोगकर्ता को भ्रमित होने की संभावना है। जवाब के लिए धन्यवाद! अन्य विचारों के लिए प्रश्न खुला रहेगा। मैं ToInt, ToDouble, आदि जैसे सुस्पष्ट वैकल्पिक ऑपरेटरों को प्रदान करना चाहता हूं क्योंकि यह एक अच्छा अभ्यास की तरह लगता है, लेकिन यह सुनिश्चित नहीं है कि इसे लागू करने का सबसे अच्छा तरीका क्या है। शायद यह वास्तव में कोई फर्क नहीं पड़ता। – SFun28

+0

मुझे लगता है कि मैं 'टीओटी()' लागू कर सकता हूं, 'प्रतिबंधित अवरोध' को प्राप्त कर सकता हूं जो 'प्रतिबंधित वैल्यू' से प्राप्त होता है और 'ToInt' को लागू करता है जो कि 'TOT()' को कॉल करता है और उसके बाद 'पॉजिटिवइंटर' को 'अवरक्त इंटेगर' – SFun28

+0

से प्राप्त होता है , उत्तर दिया गया दृष्टिकोण पूरी तरह से काम नहीं करता है। यह 'सीए 1000 उत्पन्न करता है - सामान्य प्रकारों पर स्थैतिक सदस्यों की घोषणा न करें'। जबरदस्त हंसी! – SFun28

संबंधित मुद्दे