[C#] حل أساليب الإرشاد / لينق الغموض


Answers

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

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 تحديد الاسم المستعار الخارجي:

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

هذا فشل مع:

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

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

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

Question

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

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

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

المكالمة غامضة بين الأساليب أو الخصائص التالية: ' 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 . بهذه الطريقة يمكنني استخدام ملحقات التي تقدمها ملفات ريشاربر دل.

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




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

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




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

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




هو حقا خطأ المترجم.

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




لقد وجدت نفس النوع من الغموض عند استخدام باجيدليست في مفك (.Net 4.5، مفك 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.CaseSearch تسببت نتائج الخطأ الغموض. صراحة إلى النتائج ثم استدعاء التمديد على أن عملت.