2016-12-14 12 views
9

Visual Studio 2017 RC Release Notesमैं वीएस2017 आरसी में काम कर रहे नए एसिंक सेमेन्टिक्स कैसे प्राप्त करूं?

भाषा एक्सटेंशन और एनालाइजर

यह रिलीज कुछ प्रस्तावित नई भाषा एक्सटेंशन है कि हम C# और विजुअल बेसिक के अगले संस्करणों के लिए काम कर रहे हैं शामिल हैं से हवाला देते हुए। ये नई भाषा सुविधाएं डिफ़ॉल्ट रूप से सक्षम हैं और शामिल हैं:

सी # के लिए:

  • Task-like return types for async methods: यह एक async विधि से किसी भी कार्य की तरह प्रकार वापसी करने की क्षमता का परिचय। पहले इन रिटर्न प्रकारों को Task<T> और Task पर बाध्य किया गया था।

यह कहते हैं कि यह डिफ़ॉल्ट रूप से सक्षम है, लेकिन मैं यह काम करने के लिए प्राप्त करने में सक्षम नहीं हूँ। लिंक किए गए गिथब पेज से सटीक ArbitraryAsyncReturns.zip डाउनलोड भी लेना (और असंबद्ध त्रुटियों को हटाने के लिए रिएक्ट NuGet संकुल के संदर्भों को ठीक करना), लेकिन कस्टम VSIX पैकेज (जो VS2015 के लिए है) स्थापित किए बिना, मुझे

प्राप्त करना जारी है

त्रुटि CS1983: एक async पद्धति की वापसी प्रकार शून्य होना चाहिए, कार्य या कार्य < टी >

मैं इस काम के प्राप्त करने के लिए किसी भी अतिरिक्त कदम उठाने की जरूरत है?


मैं पहली बार एक न्यूनतम संस्करण है कि काम करना चाहिए करने के लिए है कि विशिष्ट उदाहरण को कम करने, लेकिन यह साथ खेलने की कोशिश की कोशिश की, मैं अभी तक पता नहीं था क्या काम करना चाहिए और क्या नहीं करना चाहिए। बहुत कम हालांकि, इस भाषा वृद्धि को देखते हुए, मैं एक फर्जी कार्यक्रम इस तरह

struct Test { } 
static class Program { 
    static async Test Test() { } 
    static void Main() { } 
} 

रूप में एक अलग त्रुटि संदेश के साथ संकलित करने के लिए असफल हो जाने की उम्मीद। एक ही त्रुटि संदेश प्राप्त करने के बाद भी यह सुझाव दिया गया कि यह भाषा एक्सटेंशन अभी तक सक्षम नहीं था, लेकिन जेरेडपार ने देखा कि त्रुटि संदेश अभी तक अपडेट नहीं किया गया है।


मैं अब एक न्यूनतम संस्करण मुझे लगता है कि संकलन चाहिए (लेकिन लागू नहीं किया गया विधियों के कारण रन-टाइम में असफल) करने के लिए माना जाता है कि वैध उदाहरणों में से एक कम है, लेकिन संकलन नहीं करता है:

using System; 
using System.Runtime.CompilerServices; 
using System.Threading.Tasks; 

namespace System.Runtime.CompilerServices { 
    public class TasklikeAttribute : Attribute { 
     public TasklikeAttribute(Type builderType) { } 
    } 
} 

struct TasklikeTypeMethodBuilder<T> { 
    public static TasklikeTypeMethodBuilder<T> Create() => throw new NotImplementedException(); 
    public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); 
    public void SetStateMachine(IAsyncStateMachine stateMachine) => throw new NotImplementedException(); 
    public void SetResult(T result) => throw new NotImplementedException(); 
    public void SetException(Exception exception) => throw new NotImplementedException(); 
    public TasklikeType<T> Task => throw new NotImplementedException(); 
    public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); 
    public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); 
} 

[Tasklike(typeof(TasklikeTypeMethodBuilder<>))] 
struct TasklikeType<T> { } 

static class Program { 
    static void Main(string[] args) { } 
    static async TasklikeType<string> TasklikeTypeTester() { 
     await Task.Yield(); 
     return "hello"; 
    } 
} 

उपरोक्त के समान संकलक त्रुटि static async TasklikeType<string> TasklikeTypeTester() के लिए उत्पन्न होती है।

+1

क्या एक ** टास्क की तरह की अपनी समझ क्या है टाइप ** है? क्या आपने संदर्भित गिटहब मुद्दे पढ़ा है? –

+1

@PauloMorgado बेशक। मुझे नहीं लगता था कि मेरी 'टेस्ट' संरचना एक कार्य-जैसी प्रकार थी। मैंने विशेष रूप से इंगित किया कि मैंने उस कोड को संकलित करने की अपेक्षा नहीं की थी, मुझे केवल 'कार्य' की बजाय कार्य-प्रकार प्रकारों को संदर्भित करने के लिए त्रुटि संदेश अलग होने की उम्मीद थी। और मैंने गिथब मुद्दे से अनुमानित वैध कोड * भी कोशिश की, जो संकलन करने में विफल रहता है। लेकिन: एक कार्य-जैसा प्रकार उस प्रकार के 'टास्क जैसा' विशेषता के साथ एक प्रकार है (जिसे उपयोगकर्ता परिभाषित किया जा सकता है), जहां वह विशेषता एक निर्माता प्रकार निर्दिष्ट करती है। वास्तव में कंपाइलर की समस्या वास्तव में क्या नहीं है, और कुछ उदाहरण शायद ही कार्य की तरह हैं। – hvd

उत्तर

5

TasklikeAttribute विशेषता नाम पता चला है क्या, VS2017 आर सी में लागू है कि प्रस्ताव के एक अलग संस्करण से है नहीं: यहाँ पर नज़र रखने के मुद्दे पर एक लिंक है। वास्तव में लागू किया गया एक प्रकार System.Runtime.CompilerServices.AsyncMethodBuilderAttribute पर निर्भर करता है, जो ठीक उसी तरह काम करता प्रतीत होता है।

मैं इस दस्तावेज ढूँढने में सक्षम नहीं था, लेकिन मैं रोसलिन परीक्षणों में इस लगाने के लिए सक्षम था, उदाहरण के लिए CodeGenAsyncTests.cs:

[AsyncMethodBuilder(typeof(ValueTaskMethodBuilder))] 
struct ValueTask { } 
... 
namespace System.Runtime.CompilerServices { class AsyncMethodBuilderAttribute : System.Attribute { public AsyncMethodBuilderAttribute(System.Type t) { } } } 
+1

'[AsyncMethodBuilder]' '[टास्क जैसा] 'से बहुत कम सुंदर है :( –

6

कार्य-जैसे रिटर्न सक्षम करने के लिए आपको और कुछ करने की आवश्यकता नहीं है। यहां मुद्दा यह है कि इस सुविधा के लिए विकर्ण संदेश अभी तक अपडेट नहीं किया गया है।

https://github.com/dotnet/roslyn/issues/12621

+0

ओह! इसके लिए धन्यवाद, जो इसके एक हिस्से का जवाब देता है। मेरे प्रश्न में जो माना गया वैध कोड भी असफल रहता है। जब मैं कर सकता हूं, तो मैं अपने प्रश्न को न्यूनतम प्रोग्राम के साथ अपडेट करने का प्रयास करूंगा * मुझे लगता है * वैध होना चाहिए। – hvd

+0

ठीक है, यह पता चला है कि आप सही थे कि कार्य-जैसे रिटर्न सक्षम करने के लिए कुछ भी नहीं है। हालांकि, प्रस्ताव जो एमएस से जुड़ा हुआ है वह बिल्कुल लागू नहीं किया गया है ... वह व्यर्थ रूप से भ्रमित था। – hvd

+0

जैसा कि @ एचवीडी कहते हैं, वह इसका एक हिस्सा जवाब देता है, लेकिन हालांकि कार्य-जैसे रिटर्न को सक्षम करने के लिए कुछ भी नहीं है, लेकिन मुझे वीएस 2017 आरसी में बॉक्स से "वैल्यूटास्क" भी नहीं मिल रहा है, और मुझे नहीं पता अगर मुझे इसे प्राप्त करने के लिए ArbirtraryAsynReturns.zip और VSIX संकुल को डाउनलोड और स्थापित करना है। – SERWare

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