لا يمكن العثور على النوع أو اسم مساحة الاسم 'T'

لدي التعليمات البرمجية التي أنا تجميع في مشروع .NET 4.0

namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  

        }  
    }  

    public static class Utility  
    {  
        public static IEnumerable Filter1(this IEnumerable input, Func predicate)  
        {  
            foreach (var item in input)  
            {  
                if (predicate(item))  
                {  
                    yield return item;  
                }  
            }  
        }  
    }  
}  

ولكن الحصول على الأخطاء التالية. لدي System.dll المدرجة بالفعل كإعداد افتراضي في المراجع. ما قد أكون مخطئا؟

Error   1   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error   2   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error   3   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 
0

4 إجابة

public static class Utility 
{  
    public static IEnumerable Filter1(//Type argument on the function
       this IEnumerable input, Func predicate)  
    {  

إذا كنت لا تهتم إذا كان لها طريقة تمديد أم لا ، يمكنك إضافة تقييد عام للفئة. تخميني هو أنك تريد طريقة التمديد.

public static class Utility//Type argument on class
{  
    public static IEnumerable Filter1(//No longer an extension method
       IEnumerable input, Func predicate)  
    {  
0
وأضاف
PaulPhillips - أنا في الواقع حاولت ذلك وأنا لا أعتقد أنك تستطيع. أزلت هذا الجزء من الجواب.
وأضاف المؤلف SwDevMan81, مصدر
هم ممتع. لقد جربته في VS وأعطاني خطأ تجميع يجب تحديد طرق الإرشاد في فئة ثابتة غير عام . ربما linqpad يفعل ذلك قليلا بطريقة مختلفة
وأضاف المؤلف SwDevMan81, مصدر
حسنًا ، سأضيف ذلك إلى الإجابة ، لكنني متأكد من أن OP تريد طريقة الإضافة.
وأضاف المؤلف SwDevMan81, مصدر
+1 ، لقد افترضت أنك لا تستطيع جعل فئة ثابتة عامة.
وأضاف المؤلف Paul Phillips, مصدر
حصلت عليه للعمل في linqpad ، على الرغم من أن الدعوة هي نوع من الخرقاء. يجب عليك القيام Utility .Filter()
وأضاف المؤلف Paul Phillips, مصدر
أوه ، خطأي. لم أفعل طريقة تمديد. ولكن يمكنك جعل فئة ثابتة عامة.
وأضاف المؤلف Paul Phillips, مصدر

تحتاج إلى إعلان T ، الذي يحدث بعد اسم الأسلوب أو اسم الفئة. قم بتغيير تصريح الطريقة إلى:

public static IEnumerable 
    Filter1(this IEnumerable input, Func predicate) 
0
وأضاف

< T >يعني نوع من الكائنات

IEnumerable

Here you have more information: http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

0
وأضاف

يجب عليك وضع وسيطة الكتابة على الوظيفة نفسها.

public static IEnumerable Filter1(...)
0
وأضاف
سؤال ساذج ، لماذا لا يكون الاستدلال من نوع ذكي بما فيه الكفاية لمعرفة ذلك؟ يتم تمرير IEnumerable الإدخال كوسيطة ، لذلك T معروف في وقت التنفيذ.
وأضاف المؤلف foresightyj, مصدر