मैं वास्तव में सी # 5.0 असीमित प्रोग्रामिंग के साथ काम करने का आनंद ले रहा हूं। हालांकि, कुछ ऐसे स्थान हैं जहां टीएपी मॉडल के साथ पुराने कोड को अद्यतन करने के लिए अद्यतन करना मेरे लिए समस्याएं पैदा कर रहा है।कार्य <TResult> को सी # 5.0 में लपेटा जा सकता है जो ट्रेशल्ट में कॉन्वर्सेट है?
: मुझे यकीन है कि वास्तव में क्यों Task<TResult>
TResult में covariant नहीं है नहीं कर रहा हूँ, लेकिन यह मेरे लिए समस्या उत्पन्न कर रहा है जब एक covariant इंटरफ़ेस अद्यतन करने के लिए एक तुल्यकालिक से एक एसिंक्रोनस पैटर्न के लिए ले जाने का प्रयास -
यहाँ उनमें से एक है पुराने कोड:
public interface IInitializable<out T> // ** out generic modifier **
{
/// <summary>
/// Boolean to indicate if class is ready
/// </summary>
bool IsInitialized { get; }
/// <summary>
/// Calls for instance to be initialized using current parameters
/// Driver initialization can be done in the default constructor if desired
/// </summary>
T Initialize();
}
नए कोड (संकलन नहीं होगा):
public interface IAsyncInitializable<out T> // ** out generic modifier...broken **
{
/// <summary>
/// Boolean to indicate if class is ready
/// </summary>
bool IsInitialized { get; }
/// <summary>
/// Calls for instance to be initialized using current parameters
/// Driver initialization can be done in the default constructor if desired
/// </summary>
Task<T> InitializeAsync(); // ** breaks because Task<TResult> is invariant in TResult **
}
एक उचित रास्ता मो के बिना इस के आसपास है है मेरे एपीआई बहुत भारी है? (बोनस: कार्य क्यों नहीं है?)। कोई IAwaitable इंटरफ़ेस नहीं है, लेकिन मुझे लगता है कि मैं एक बना सकता हूं और एक विस्तार विधि बना सकता हूं जो एक लिपटे, कॉन्विएन्ट, अजीब कार्य ऑब्जेक्ट में परिवर्तित हो जाता है। या मैं यह गलत कर रहा हूँ?
Btw, भले ही 'Task' एक covariant इंटरफेस था, अपने कोड संकलन नहीं होगा:
में और जानकारी यहां पाया जा सकता है। सही संस्करण 'कार्य आरंभिकएसिंक(); '(उस पंक्ति पर' आउट 'संशोधक के बिना) होगा। –
svick
एक उत्कृष्ट बिंदु। मैं इसे वीएस में सही कर दूंगा, लेकिन एसओ संपादित करना भूल गया। –