الأدوية العامة لـ C#، لا يمكن استنتاج وسيطات النوع للأسلوب “xxxxxxxxx” من الاستخدام.


سؤال عام في لغة C#،

أتلقى الخطأ التالي من جانب المتصل:

لا يمكن استنتاج وسيطات النوع للطريقة ‘xxxxxxxxx’ من الاستخدام. حاول تحديد وسيطات النوع بشكل صريح.

المتصل:

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

lstTransferObject = GetDtoList(a, b);

الخطأ موجود في أسلوب GetDtoList، لقد حاولت تحديد الاستدعاء كـ .GetDtoList((string) a, (byte[]) ب) ولم ينجح هذا، لذلك أسيء تفسير رسالة الخطأ. مصدر 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) بحثت في مشكلات مماثلة تتعلق بالمكدس وCP (يبدو أن معظمها يعتمد على MVC).

الحل 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 العمل الرئيسي مع أي منهما object أو T، سوف تحصل على خطأ في برنامج التحويل البرمجي يوضح لك ماهية المشكلة.

إذا كنت ترغب في العودة قائمة dynamic الكائنات، فيجب أن تعود طريقتك List<dynamic>. إذا كنت تريد إرجاع قائمة من نوع معين، فأنت بحاجة إلى إنشاء مثيل لهذا النوع المحدد في حلقتك.

コメント

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