2012-05-17 18 views
8

संभव प्रकारों के सेट से विशिष्ट प्रकारों को बाहर करना संभव है, जिनका उपयोग सामान्य पैरामीटर में किया जा सकता है? यदि हां, तो कैसे।जेनेरिक बाधाओं में संभावित प्रकार (संभावित?)

उदाहरण

Foo<T>() : where T != bool 

के लिए प्रकार bool के अलावा किसी भी प्रकार का मतलब होगा।

संपादित

क्यों?

निम्नलिखित कोड नकारात्मक बाधा को लागू करने का मेरा प्रयास है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     var x1=Lifted.Lift("A"); 
     var x2=Lifted.Lift(true); 
    } 
    static class Lifted 
    { 
     // This one is to "exclude" the inferred type variant of the parameter 
     [Obsolete("The type bool can not be Lifted", true)] 
     static public object Lift(bool value) { throw new NotSupportedException(); } 
     // This one is to "exclude" the variant where the Generic type is specified. 
     [Obsolete("The type bool can not be Lifted", true)] 
     static public Lifted<T> Lift<T>(bool value) { throw new NotSupportedException(); } 
     static public Lifted<T> Lift<T>(T value) { return new Lifted<T>(value); } 
    } 

    public class Lifted<T> 
    { 
     internal readonly T _Value; 
     public T Value { get { return this._Value; } } 
     public Lifted(T Value) { _Value = Value; } 
    } 
    } 
} 

आप देख सकते हैं यह सही किया जा रहा अधिभार संकल्प में विश्वास का एक सा शामिल है, और @jonskeet -esque बुराई कोड का सा।

अनुमानित प्रकार के उदाहरण के साथ सौदे के साथ अनुभाग को टिप्पणी करें और यह काम नहीं करता है।

यह सामान्य जेनेरिक बाधा को छोड़कर इतना बेहतर होगा।

+2

उपयोग का क्या उपयोग होगा? 'जहां टी: एक्स' का अर्थ है' टी' में 'x' की क्षमता है। एक नकारात्मक बाधा अर्थहीन लगता है। –

+0

आप ऐसा क्यों करना चाहते हैं? आप क्या हासिल करने का प्रयास कर रहे हैं? – zmbq

+0

मूल पोस्ट पर अद्यतन संपादन देखें। –

उत्तर

4

नहीं, आप टाइप बाधाओं का उपयोग करके इस तरह के एक-एक बहिष्करण नहीं कर सकते हैं। आप इसे रनटाइम पर कर सकते हैं हालांकि:

public void Foo<T>() 
{ 
    if (typeof(T) == typeof(bool)) 
    { 
     //throw exception or handle appropriately. 
    } 
} 
+0

मैं रन-टाइम पर जेनेरिक प्रकारों की जांच करने का प्रशंसक नहीं हूं, जब संभवतः संकलक संकलन समय पर इसे लागू कर सकता है। –

+0

@AdamSpeight आप वर्तमान में जो पूछ रहे हैं वह संभव नहीं है। प्रकारों को बाध्य किया जाना चाहिए कि वे क्या कर सकते हैं, न कि वे क्या हो सकते हैं। – vcsjones

+0

क्या यह एक सीएलआर प्रतिबंध है? –

0

यह प्रोग्राम के एक पहलू की तरह लगता है। शायद आप संकलन-समय पर इस बाधा को प्रदान करने के लिए आस्पेक्ट ओरिएंटेड प्रोग्रामिंग पर विचार कर सकते हैं।

PostSharp इस क्षमता को प्रदान करना चाहिए।

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