मेरे पास सी # 8 का उपयोग करके कार्यान्वित निम्न (कार्यशील) सेवा है, लेकिन शून्य संदर्भ प्रकार अक्षम के साथ:

public class Foo { }

public interface IFooService
{
    Task<T> Get<T>() where T : Foo;
}

public FooService : IFooService
{
    async Task<T> IFooService.Get<T>() { /* returns either a valid Foo implementation or null */ }
}

मैंने सी # 8 अशक्त संदर्भ प्रकारों को सक्षम करने का प्रयास किया, लेकिन त्रुटियों या चेतावनियों से छुटकारा पाने के लिए प्रतीत नहीं होता, जो कुछ भी मैं करता हूं। नया इंटरफ़ेस प्रकार है:

public interface IFooService
{
    // T IS nullable AND a reference type.
    // There is no ambiguity as of 'T?' meaning here, because it can't be a struct.
    Task<T?> Get<T>() where T : Foo;
}

जब मैं निम्नलिखित कार्यान्वयन का उपयोग करता हूं:

public class FooService : IFooService
{
    async Task<T?> IFooService.Get<T>() { /* ... */ }
}

मुझे त्रुटि मिलती है:

'FooService' does not implement interface member 'IFooService.Get<T>()'

जो मुझे समझ में नहीं आता क्योंकि इंटरफ़ेस और कार्यान्वयन में हस्ताक्षर बिल्कुल समान हैं।

हालांकि, जब मैं इंटरफ़ेस को इस रूप में कार्यान्वित करता हूं (जो हस्ताक्षर विजुअल स्टूडियो का ऑटो-कार्यान्वयन उत्पन्न होता है):

public class FooService : IFooService
{
    async Task<T> IFooService.Get<T>() { /* ... */ }
}

मुझे निम्नलिखित चेतावनी मिलती है:

Nullability of reference types in return type doesn't match implemented member 'Task<T?> IFooService.Get<T>()'.
2
Maxime Rossini 3 अप्रैल 2020, 19:04

1 उत्तर

सबसे बढ़िया उत्तर

आपको अपने कार्यान्वयन में सामान्य बाधा जोड़ने की आवश्यकता है:

public class FooService : IFooService
{
    async Task<T?> IFooService.Get<T>() where T : class
    {
        /* ... */ 
    }
}

यह दिलचस्प है कि कैसे विजुअल स्टूडियो T? को उसके द्वारा उत्पन्न कार्यान्वयन में नहीं जोड़ता है। मुझे संदेह है कि यह संपादक में एक बग है।

आप उल्लेख करते हैं कि आपका प्रकार स्थिरांक वास्तव में Foo के विरुद्ध है। इसका मतलब है कि आपका कोड इस तरह दिखेगा:

public class Foo
{
}

public interface IFooService
{
    // T IS nullable AND a reference type.
    // There is no ambiguity as of 'T?' meaning here, because it can't be a struct.
    Task<T?> Get<T>() where T : Foo;
}

public class FooService : IFooService
{
    async Task<T?> IFooService.Get<T>() where T : class
    {
        throw new NotImplementedException();
    }
}

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

4
Sean 3 अप्रैल 2020, 19:22