I'm writing an add-in for ReSharper 4. For this, I needed to reference several of ReSharper's assemblies. One of the assemblies (JetBrains.Platform.ReSharper.Util.dll) contains a System.Linq
namespace, with a subset of extension methods already provided by System.Core.
When I edit the code, it creates an ambiguity between those extensions, so that I cannot use OrderBy
, for instance. How could I solve this? I would like to use the core LINQ extensions, and not the ones from ReSharper.
I get the following error when trying to compile:
The call is ambiguous between the following methods or properties: '
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>
)'
EDIT: I tried the suggestion below, unfortunately without luck. In the meanwhile, I "solved" the problem by removing references to System.Core
. This way I could use the extensions provided by ReSharper DLL files.
I uploaded a sample program where I just imported the ReSharper DLL files I needed. I changed the alias of System.Core
to SystemCore
, added the extern alias
directive, but it still didn't work. If I missed something, please let me know. P.S. The references are to ReSharper v4.1 DLL files installed in the default directroy in "C:\Program Files\JetBrains\ReSharper\v4.1\..."
.
Ambiguity can be resolved if concurrent namespaces which have extension methods with same name, are included at different levels (most inner included namespace will have priority).
LINQ provides many extension methods for filtering, grouping, sorting and many more which will make developers' lives easy.
This is probably one of those rare cases where it makes sense to use an extern alias.
In the properties page for the reference to System.Core (i.e. under References, select System.Core, right-click and select "Properties"), change the "Aliases" value to "global,SystemCore" (or just "SystemCore" if it's blank to start with).
Then in your code, write:
extern alias SystemCore; using SystemCore::System.Linq;
That will make all the relevant types etc in System.Core.dll's System.Linq namespace available. The name "SystemCore" here is arbitrary - you could call it "DotNet" or something else if that would make it clearer for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With