使用#I和动态引用.fsx中的程序集时#r,VS会突出显示导入类型的以下用法并写入"未定义名称空间或模块'XXX'".好吗?
例如,在以下代码中
#I @".\Tools\FAKE"
#r "FakeLib.dll"
open Fake
Target "Hello" (fun _ -> trace "hello!")
Run "Hello"
Run Code Online (Sandbox Code Playgroud)
VS亮点Fake并说"命名空间或模块'假'未定义",它也突出显示Target和Run.我在VS 2010 SP1和VS 11 CTP中遇到此问题.这个问题使得编写F#脚本的任务比它更难.
顺便说一句,IntelliSence对于"常见"类型很有效.FakeLib.dll和FakeLib.xml存在于.\Tools\FAKE目录中.代码运行良好.
更新1
这是情况的屏幕截图.您可以看到VS FakeLib正确地解析了程序集(在工具提示中),同时Intellisense"看到"标准类型(tooltip over Console)类.

更新2
我认为我的工作站上的IntelliSense出现了问题,因为它(IntelliSense)本身就很奇怪.当我启动VS并打开.fsx文件时,IntelliSense甚至拒绝解析标准类型/类,并且它不会强调FAKE类,它什么都不做.但经过一段时间后,对代码进行了一些操作,IntelliSense开始为标准类型和下划线FAKE类型工作.
此外,当我在家庭工作站上创建类似代码时,没有任何问题,IntelliSense可以正常工作.
根据这个问题 的答案,async/await调用应该保留CurrentCulture.就我而言,当我调用自己的异步方法时,将保留CurrentCulture.但是,如果我调用某种WCF服务方法,则不会保留CurrentCulture,它会被更改为看起来像服务器默认线程文化的东西.
我已经了解了调用托管线程的内容.它发生在每个代码行都在一个托管线程上执行(ManagedThreadId保持不变).在调用我自己的异步方法后,CultureInfo保持不变.但是当我调用WCF的方法时,ManagedTrheadId保持不变,但CurrentCulture已更改.
简化的代码如下所示::
private async Task Test()
{
// Befoe this code Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server's culture
// Here we change current thread's culture to some desired culture, e.g. hu-HU
Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU");
var intres = await GetIntAsync();
// after with await Thread.CurrentThread.CurrentCulture is still "hu-HU"
var wcfres = await wcfClient.GetResultAsync();
// And here Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server's culture
}
private async Task<int> GetIntAsync()
{
return await Task.FromResult(1);
} …Run Code Online (Sandbox Code Playgroud) 假设我在https://www.mysvn.com/svn/上有一个svn存储库.如何使用SharpSVN确定服务器上是否存在远程文件夹https://www.mysvn.com/svn/a/b/c?
我需要这样做,这样我就能告诉失败的连接(即服务器关闭)和尚未创建的文件夹之间的区别.
在完整的https://www.mysvn.com/svn/a/b/c路径上调用信息似乎没有给出异常,这使我能够区分完全没有存储库和只缺少文件夹.
我可以列出https://www.mysvn.com/svn/的所有文件,但是存储库很容易变得太大,以至于这可能需要很长时间.
现在我首先在根网址上执行信息,然后在完整网址上执行信息.如果根URL失败我将其视为服务器问题,但如果它成功并且完整URL失败,我会假设它,因为部分路径尚未在服务器上创建.但是,如果两次检查之间的互联网连接丢失,则可能会给出错误的答案.
我正在阅读" 真实世界的函数式编程 "一书,在阅读本书的例子之前,我试图提出自己的尾递归示例(见10.2,第265页).这本书的例子有效; 我的堆栈溢出.
我发现如果我使用元组参数或预先计算a + accum然后我的工作.我想了解原因.
let rnd = new System.Random()
let test2 = List.init 1000000 (fun _ -> rnd.Next(-50, 51))
let rec sum2 list accum =
match list with
| [] -> accum
| a::b -> sum2 b a + accum
let result = sum2 test2 0
printfn "%d" result
Run Code Online (Sandbox Code Playgroud) 根据文档 HttpResponseException由Web API自动处理,Web API应该只返回HttpResponseMessage给客户端HttpStatusCode.它通常有用......
但是,如果我们HttpResponseException从标记为的操作中抛出,async那么这只是不起作用,并且HttpResponseException只是使用诸如"用户代码未处理异常"消息之类的东西崩溃整个服务.添加自定义异常过滤器无法解决问题,因为Web API无法捕获HttpResponseException消息.
更新1
我进一步调查并发现,只要await向操作添加修饰符,此操作的每个未处理的异常都会崩溃Web API服务.并且不涉及ExceptionFilterAttributes,Web API只是不执行它们.您甚至不必从真正的异步代码中抛出异常,只需添加async操作就可以使每个异常完全无法处理.
在这里,这工作正常,异常可以被一些异常过滤器捕获:
public void Test()
{
throw new Exception("Hello");
}
Run Code Online (Sandbox Code Playgroud)
这会导致服务崩溃:
public async void Test()
{
throw new Exception("Hello");
}
Run Code Online (Sandbox Code Playgroud)
更新2
好吧,如果我们void改为某种真实类型,看起来一切正常,这里:
public async Task<int> Test()
{
throw new Exception("Hello");
}
Run Code Online (Sandbox Code Playgroud)
所以,看起来像未处理的异常async void导致服务崩溃,但async Task<SomeType>效果很好,异常过滤器捕获一切,除了HttpResponseException和HttpResponseException正确的网络API处理.
看起来我刚刚跟自己说过,但是找出为什么行动中的异常无法正确处理会很有趣?async void
没有Teamcity,我会将所有内容都放在一个大的.fsx脚本中,然后“解雇”。可以有一个单独的脚本来完成所有工作。
但是,当我们将.fsx脚本放入Teamcity时,一切都变了。Teamcity具有不错的构建日志和构建步骤功能,但是将所有逻辑放入同一脚本和构建步骤中会产生巨大的构建日志。
我们已经在单个.fsx脚本中进行了构建和测试,我也打算将分布式构建放入其中。但是现在我不认为这是个好主意。也许最好将此构建脚本拆分为多个构建脚本并在多个构建步骤中运行它们?
但是使用多个脚本,如果需要,在没有Teamcity的情况下在本地运行构建不太方便。或者,对于每个任务,我们可以有几个小型构建脚本,而本地构建的一个构建脚本将调用所有这些小型脚本。
最好的解决方案是什么?
我想在F#中做这个C#代码
string[] a = new string[5];
string b = string.Empty;
a[0] = "Line 1";
a[2] = "Line 2";
foreach (string c in a)
{
b = c + Environment.NewLine;
}
Run Code Online (Sandbox Code Playgroud) 必须有更好的方法来做到这一点.我只想将长字符串分成60个字符行,但不要破坏单词.所以它不必添加多达60个字符,只需要小于60.
下面的代码是我所拥有的并且它有效,但我认为有更好的方法.任何人?
修改为使用StringBuilder并修复了删除重复单词的问题.也不想使用正则表达式,因为我认为这将比我现在的效率低.
public static List<String> FormatMe(String Message)
{
Int32 MAX_WIDTH = 60;
List<String> Line = new List<String>();
String[] Words;
Message = Message.Trim();
Words = Message.Split(" ".ToCharArray());
StringBuilder s = new StringBuilder();
foreach (String Word in Words)
{
s.Append(Word + " ");
if (s.Length > MAX_WIDTH)
{
s.Replace(Word, "", 0, s.Length - Word.Length);
Line.Add(s.ToString().Trim());
s = new StringBuilder(Word + " ");
}
}
if (s.Length > 0)
Line.Add(s.ToString().Trim());
return Line;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我尝试转换像"hh:mm:ss"或"dd.mm.yyyy hh:mm:ss"之类的字符串,但我没有完成:(代码那样:
public DateTime[] tarihSaat = new DateTime[documentRowCount]
string c = "27.12.2010 00:00:00"
tarihSaat[0] = DateTime.ParseExact(c, "dd.MM.yyyy hh:mm:ss", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
但它没有用.任何建议?
是否有可能将record optionF#中的值返回到C#作为空值?我想在F#程序集中封装一些逻辑,并尽可能地隐藏在Facade后面"对C#更自然".这是一些合成的例子:
type Data = { DataField1: int; DataField2: string }
Run Code Online (Sandbox Code Playgroud)
返回C#的代码如下所示:
type SomeFacade() =
let data = Some { DataField1 = 1; DataField2 = "hello" }
member x.GetData() = if Option.isSome data then Option.get data else null
Run Code Online (Sandbox Code Playgroud)
但是不允许使用空值.
[<AllowNullLiteral>]属性,但它不能用于记录类型.Class而不是Record但在F#中使用它会更复杂,因为大多数工作应该在F#部分内完成.我喜欢通过使用with关键字复制另一个记录值来创建记录值的极其方便的方法.Data在F#程序集中使用它作为记录,并DataClass在暴露给C#程序集时将其转换为某个中间类,但它看起来很尴尬.有什么解决方案吗?(我不打算在F#代码中使用空值,但我想将空值返回给C#代码).
c# ×4
f# ×4
.net ×2
string ×2
async-await ×1
cultureinfo ×1
datetime ×1
exception ×1
f#-fake ×1
f#-scripting ×1
intellisense ×1
null ×1
option ×1
parsing ×1
record ×1
recursion ×1
sharpsvn ×1
svn ×1
teamcity ×1
wcf ×1