[C#] حل طرق تمديد / غموض LINQ



Answers

هذا ليس حقاً إجابة ، ولكن قد يوفر طريقة أسهل للآخرين لإعادة إظهار المشكلة (من سطر الأوامر - يمكنك القيام بذلك مع مشروعين في Visual Studio إذا أردت).

1) إنشاء BadLinq.cs وإنشائه كـ BadLinq.dll:

using System.Collections.Generic;

namespace System.Linq
{
    public static class Enumerable
    {
        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, 
                                              Func<T,bool> predicate)
        {
            return null;
        }
    }
}

2) إنشاء Test.cs:

extern alias SystemCore;

using System;
using SystemCore::System.Linq;

static class Test
{
    static void Main()
    {
        var names = new[] { "Larry", "Curly", "Moe" };

        var result = names.Where(x => x.Length > 1);
    }
}

3) ترجمة Test.cs تحديد الاسم المستعار extern:

csc Test.cs /r:BadLinq.dll /r:SystemCore=System.Core.dll

هذا فشل مع:

Test.cs (11،28): خطأ CS1061: لا يحتوي 'System.Array' على تعريف لـ 'Where' ولا طريقة امتداد 'Where' يمكن العثور على قبول أول وسيطة من النوع 'System.Array' (هل أنت موجود؟ في عداد المفقودين باستخدام التوجيه أو مرجع التجميع؟)

إذا قمت بتغييره إلى عدم محاولة استخدام طريقة ملحق (على سبيل المثال Enumerable.Where) فإنه يعمل بشكل جيد مع الاسم المستعار extern.

أعتقد أن هذا قد يكون خطأ مترجم. أرسل إلينا قائمة بريدية خاصة يقرأها فريق C # - سأقوم بتحديث هذه الإجابة أو إضافة واحدة جديدة عند سماعها.

Question

أنا أكتب الوظيفة الإضافية ل ReSharper 4. لهذا ، كنت بحاجة إلى الرجوع إلى العديد من الجمعيات ReSharper ل. يحتوي أحد التجميعات (JetBrains.Platform.ReSharper.Util.dll) على مساحة اسم System.Linq ، مع مجموعة فرعية من أساليب ملحق المتوفرة من قبل System.Core بالفعل.

عندما أحرر الشفرة ، فإنه ينشئ غموضًا بين تلك الإضافات ، بحيث لا يمكنني استخدام OrderBy ، على سبيل المثال. كيف يمكنني حل هذا؟ أرغب في استخدام ملحقات LINQ الأساسية ، وليس تلك الموجودة في ReSharper.

أتلقى الخطأ التالي عند محاولة ترجمة:

تكون الدعوة مبهمة بين الطرق أو الخصائص التالية: " System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string> ، System.Func<string,int>)' and 'System.Linq.Enumerable.OrderBy<string,int>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int> ) '

تحرير: حاولت الاقتراح أدناه ، للأسف دون الحظ. في هذه الأثناء ، "حل" المشكلة عن طريق إزالة المراجع إلى System.Core . بهذه الطريقة يمكنني استخدام الملحقات التي توفرها ملفات DLL ReSharper.

قمت بتحميل برنامج عينة حيث قمت فقط باستيراد ملفات DLL ReSharper التي أحتاجها. لقد قمت بتغيير الاسم المستعار System.Core إلى SystemCore ، وأضاف التوجيه extern alias ، لكنه ما زال لا يعمل. إذا فاتني شيء ما ، فالرجاء إخباري بذلك. سكرتير خاص المراجع هي لملفات DLL ReSharper v4.1 المثبتة في directroy الافتراضي في "C:\Program Files\JetBrains\ReSharper\v4.1\..." .




لقد وجدت نفس هذا النوع من الغموض عند استخدام PagedList في MVC (.Net 4.5 ، MVC 5). وجدت أنه إذا أخذت الموضوع للحجة التي كانت غامضة وألقاها صراحة أولاً ، تم حل المشكلة. إذا كان الغموض بين طريقة تأخذ System.Linq.Enumerable وأخرى تأخذ System.Collections.Generic.IEnumerable كمعامل في السؤال ، والمصدر من النوع System.Collections.Generic.IEnumerable ، لا استخدم طريقة التمديد على ذلك. لقد قمت بإدخالها. في هذا المثال ، يقوم أسلوب المستودع الخاص بي بإرجاع قائمة:

searchRequest.CaseSearchResults = csr.SelectMatchingCases(searchRequest);
var results = searchRequest.CaseSearchResults.AsEnumerable<CaseSearchResult>();
int pageNum = (int)(ViewBag.PageNum ?? 1);
var pageResults =results.ToPagedList<CaseSearchResult>(pageNum, 5);

استدعاء طريقة الامتداد على searchRequest.CaseSearchResults تسبب في خطأ الغموض ؛ صراحة إلى النتائج ثم استدعاء التمديد على ذلك العمل.




لكي تكون ReSharper متوافقة قدر الإمكان مع مجموعة متنوعة من الحلول التي يتم استخدامها مع ، تم تصميمها على .NET 2.0. جاء LINQ ، وما إلى ذلك في C # 3.0 ، لذلك فهي غير متوفرة في هذا الإصدار من الإطار. لذلك ، أضاف JetBrains في نسختهم الخاصة.

الحل هو بناء addin الخاص بك ضد .NET 2.0 كذلك.




إنه حقا خطأ مترجم.

واجهت نفس المشكلة ، وحلت ذلك فقط عن طريق تنظيف وإعادة بناء المشروع. بعد ذلك اختفت المشكلة.




سيكون أحد الحلول نقل كل التعليمات البرمجية الخاصة بك إلى فئة جزئية تستخدم رمز ReSharper. هناك ، يمكنك استيراد مساحة الاسم ReSharper فقط وليس System.Core.

في باقي الفئة الجزئية ، ستقوم باستيراد كافة مساحات الأسماء الأخرى التي تحتاج إليها ، بما في ذلك System.Core ، وليس مساحة الاسم ReSharper.




Links