सी# जेनरिक, विधि ‘xxxxxxx’ के प्रकार के तर्कों का उपयोग से अनुमान नहीं लगाया जा सकता है।


सी# जेनरिक प्रश्न,

मुझे कॉलर पक्ष पर निम्नलिखित त्रुटि मिल रही है:

विधि ‘xxxxxxxx’ के प्रकार के तर्कों का उपयोग से अनुमान नहीं लगाया जा सकता है। प्रकार के तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

कॉल करने वाला:

List<TransferObject> lstTransferObject = new List<TransferObject>();

lstTransferObject = GetDtoList(a, b);

त्रुटि GetDtoList विधि पर है, मैंने कॉल को .GetDtoList((string) a, (बाइट) के रूप में निर्दिष्ट करने का प्रयास किया है[]) बी) और यह काम नहीं किया, इसलिए मैं त्रुटि संदेश की गलत व्याख्या कर रहा हूं। GetDtoList का स्रोत इस प्रकार है:

public static List<T> GetDtoList<T>(string k, byte[] s)
{
    List<T> lst = new List<T>();
    foreach(Code_dto dto in Code_GetList())
    {
        dynamic item = new { Name = "code", Data = dto.GetCodeString(k, s) };
        lst.Add(item);
    }

    return lst;
}

नीचे दिए गए प्रश्न के उत्तर में… कुछ भी रोमांचक नहीं है, यह बस एक सूची लौटाता है। कुछ इस तरह दिखता है:

private static List<Code_dto> Code_GetList()
{
	List<Code_dto> lstCodeDto = new List<Code_dto>();
	
	// Grab records from the db and add to the list
	
	return lstCodeDto;
}

मैंने क्या प्रयास किया है:

1) टीम के अन्य साथी द्वारा रैन समस्या
2) समान स्टैक और सीपी मुद्दों पर शोध किया गया (अधिकांश एमवीसी आधारित प्रतीत होते हैं)।

समाधान 1

सामान्य प्रकार के पैरामीटर के लिए प्रकार तर्क का अनुमान केवल तभी लगाया जा सकता है जब इसका उपयोग इनपुट पैरामीटर में किया जाता है। अन्य सभी मामलों में, प्रकार पैरामीटर को स्पष्ट रूप से घोषित किया जाना चाहिए।

इन सभी के लिए प्रकार पैरामीटर का अनुमान लगाया जा सकता है:

सी#
public static T Foo<T>(T bar) { ... }
int x = Foo(42);

public static T FirstOrDefault<T>(IEnumerable<T> source) { ... }
string item = FirstOrDefault(myListOfStrings);

public static IEnumerable<T> Where<T>(IEnumerable<T> source, Func<T, bool> predicate) { ... }
IEnumerable<Bar> filteredList = Where(myListOfBars, bar => someCondition);

लेकिन जब कोई भी इनपुट पैरामीटर टाइप पैरामीटर से संबंधित नहीं होता है, तो आपको टाइप पैरामीटर को स्पष्ट रूप से निर्दिष्ट करना होगा:

सी#
public static List<T> MakeAList<T>(int x, string y) { ... }

List<Bar> myList = MakeAList(42, "Hello"); // Compiler error
List<Bar> myList = MakeAList<Bar>(42, "Hello"); // OK

तो, आपके उदाहरण में, आपको चाहिए:

सी#
lstTransferObject = GetDtoList<TransferObject>(a, b);

तथापियह काम नहीं कर पाया. आपका कोड संकलित हो जाएगा, लेकिन आपको रनटाइम पर एक अपवाद मिलेगा, क्योंकि आप एक प्रकार की वस्तु को एक अलग प्रकार की सूची में जोड़ने का प्रयास कर रहे हैं। यदि आप प्रतिस्थापित करते हैं dynamic या तो के साथ keywork object या Tआपको एक कंपाइलर त्रुटि मिलेगी जो आपको दिखाएगी कि समस्या क्या है।

यदि आप की एक सूची वापस करना चाहते हैं dynamic ऑब्जेक्ट्स, तो आपकी विधि वापस आनी चाहिए List<dynamic>. यदि आप किसी विशिष्ट प्रकार की सूची वापस करना चाहते हैं, तो आपको अपने लूप में उस विशिष्ट प्रकार का एक उदाहरण बनाना होगा।

コメント

タイトルとURLをコピーしました