2010-06-28 1 views
10

Я использую некоторые типы F # (Matrix и др.) Из C#, поэтому мне нужно ссылаться на сборку FSharp.Core в моем проекте C#. Все идет нормально.В том числе FSharp.Core в проекте C#: конфликты разрешающего типа

Однако существуют, по-видимому, некоторые типы, определенные в mscorlib.dll (v4), которые «дублируются» в FSharp.Core (v2), например System.Tuple и System.IObservable. Я не могу понять, почему это в .NET 4. Matt Ellis specifically said they would be removed in his MSDN article:

One language suffering that [duplication] problem was F#, which previously had defined its own tuple type in FSharp.Core.dll but will now use the tuple added in Microsoft .NET Framework 4.

Я готов смотреть мимо этого конкретного неблаговидной дублирования, если я мог бы просто указать, какой я хочу использовать в моей программе C#, однако , Когда я пытаюсь использовать System.Tuple типа, например, я получаю следующее сообщение об ошибке C# компилятор:

Error 2 The type 'System.Tuple' exists in both 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\mscorlib.dll' and 'c:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v2.0\FSharp.Core.dll'

путь вокруг этого, по-видимому, является a switch on the C# compiler command line which aliases the type:

csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll

Однако, я не могу найти способ заставить Visual Studio отправить этот параметр в компилятор C#.

У кого-нибудь есть решение?

ответ

12

Вам необходимо указать версию версии F # версии 4.0. Эта версия соответствует версии 4.0 mscorlib 4.0 и не имеет конфликтующих типов. Они будут находиться в этом каталоге

C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v4.0

+0

Обратите внимание, что версия 4.0 находится в 'c: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v4.0 \ FSharp.Core.dll'. Вы использовали ссылку «добавить ссылку», чтобы получить ссылку? Интересно, как вы попали, ссылаясь на 2.0 в проекте 4.0. – Brian

+0

Да, я использовал ссылку «Добавить ссылку», чтобы получить это ... однако у меня есть VS PowerTools с улучшенным диалоговом окном Add Reference, поэтому это может быть проблемой. – codekaizen

+0

@Brian, царапина это. Я, должно быть, просмотрел его, и просто не понял, что F # v2.0 также может нацеливаться на CLRv2 и поэтому имеет два разных набора сборок. – codekaizen

3

Вы можете разрешить конфликты с помощью C# assembly aliases и сборки квалификационной источник явно в C# код: например, если у вас есть тип Tuple определен как в F # сборке и в вас библиотеках.

+0

Это классно, и я не знал о «extern alias» в C#, но он также отмечает, что «псевдоним должен быть указан в командной строке», который в лучшем случае выглядит неясным и непрактичным в Visual Студия. – codekaizen

+1

VS поддерживает эту функцию: вы можете указать псевдоним в свойствах ссылки на сборку – desco

+0

Wow. Круто! Спасибо за отличный совет. +1. – codekaizen