मैं इस तरह नमूना उपयोग कुछ के लिए देख रहा हूँ होने के लिए सामान्य:विवश एक नल प्रकार
Foo<string> stringFoo = new Foo<string>("The answer is");
Foo<int> intFoo = new Foo<int>(42);
// The Value of intFoo & stringFoo are strongly typed
stringFoo.Nullify();
intFoo.Nullify();
if (stringFoo == null && intFoo == null)
MessageBox.Show("Both are null);
इस वर्ग फू देखते हुए, मैं कर सकते हैं एक नल में ऑटो चादर टी:
public class Foo1<T>
where T : struct
{
private T? _value;
public Foo(T? initValue)
{
_value = initValue;
}
public T? Value { get { return _value; } }
public void Nullify { _value = null; }
}
यह primitives के लिए काम करता है, लेकिन स्ट्रिंग या अन्य कक्षाओं के साथ नहीं।
अगला स्वाद स्ट्रिंग्स के लिए काम करता है, लेकिन नहीं पुरातन:
public class Foo2<T>
{
private T _value;
public Foo(T initValue)
{
_value = initValue;
}
public T Value { get { return _value; } }
public void Nullify { _value = default(T); }
}
मैं foo2 के लिए Nullable<int>
इस्तेमाल कर सकते हैं और कोड इस तरह काम करेगा:
Foo2<int?> intFoo = new Foo<int?>(42);
लेकिन इस त्रुटि होने का खतरा है, क्योंकि यह विफल रहता है Foo2 के लिए। अगर मैं टी को ऐसे प्रकार के रूप में रोक सकता हूं जो शून्यता का समर्थन करते हैं तो यह ठीक होगा।
तो इसके बाद, टी को एक निरर्थक प्रकार होने के लिए बाध्य करने का कोई तरीका है?
कुछ अतिरिक्त नोट्स: .NET 4.0, VS2010। और मुझे यहां पर एक समान प्रश्न मिला, लेकिन एक सफल जवाब के बिना।
दिलचस्प। वास्तविक जीवन में फू अधिक जटिल है और स्वचालित रूप से एक ढांचे द्वारा बनाया गया है। मुझे यह देखने की आवश्यकता होगी कि इस दृष्टिकोण को व्यवहार्य बनाने के लिए ऑब्जेक्ट्स बनाए जाने के तरीके को हुक/अनुकूलित करने का कोई तरीका है या नहीं। – tcarvin
स्वीकृत, क्योंकि यह लाइब्रेरी के आंतरिक ग्राहक (डिजाइन/संकलन समय बनाम रनटाइम) को कम से कम आश्चर्य देता है। लेकिन @ जोन्स स्केट द्वारा उपयोग किया गया परीक्षण भी बहुत अच्छा था! – tcarvin