让我们考虑一下这个非常简单的异步方法:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Run Code Online (Sandbox Code Playgroud)
当我用VS2013(前Roslyn编译器)编译它时,生成的状态机是一个结构.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用VS2015(Roslyn)编译它时生成的代码是这样的:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,Roslyn生成一个类(而不是结构).如果我没记错的话,旧编译器中的async/await支持的第一个实现(我认为是CTP2012)也生成了类,然后由于性能原因将其更改为struct.(在某些情况下,你可以完全避免拳击和堆分配......)(见这个)
有谁知道为什么罗斯林再次改变了这一点?(我对此没有任何问题,我知道这个改变是透明的,不会改变任何代码的行为,我只是好奇)
编辑:
来自@Damien_The_Unbeliever(以及源代码:))imho的答案解释了一切.描述的Roslyn行为仅适用于调试版本(由于注释中提到的CLR限制,这是必需的).在Release中它还生成一个结构(具有该...的所有好处).所以这似乎是一个非常聪明的解决方案,支持编辑和继续以及更好的生产性能.有趣的东西,感谢所有参与的人!
注意:这里我讲的是dotnet核心,而不是完整的框架!对于完整的框架,有很多关于此的文档,但这是dotnet核心.
我有一个F#库
dotnet new --lang F#
Run Code Online (Sandbox Code Playgroud)
和一个ASP.NET Core RC2 C#应用程序(由VS中的File-> New Project创建).
现在我使用来自C#的F#库(我想这是一个非常常见的场景......).在Project.json中引用F#项目作为任何其他.net库(通过在依赖项下列出它)
现在所有这些编译和工作正常,这是伟大的!
唯一的问题是VS似乎不支持它.没有intellisense和行,我使用C#中的F#函数标记为错误.从C#到F#的调试也不起作用.我在带有VS Code的Mac上尝试过,同样的......
当我点击编译时,编译器会想出来,一切都很好.
所以基本上我最终得到了VS解决方案,其中包含一堆错误,仍然可以编译.
这是一个简单的复制器.
问题:
以下是重现器的代码:
F#library - project.json(由cli创建 - dotnet new --lang F#)
"version": "1.0.0-*",
"buildOptions": {
"compilerName": "fsc",
"compile": {
"includeFiles": [
"FSharpLibrary.fs"
]
}
},
"dependencies": {
"Microsoft.FSharp.Core.netcore": "1.0.0-alpha-160316",
"NETStandard.Library": "1.5.0-rc2-24027"
},
"tools": {
"dotnet-compile-fsc": {
"version": "1.0.0-*",
"imports": [
"dnxcore50",
"portable-net45+win81",
"netstandard1.3"
]
}
},
"frameworks": {
"netstandard1.5": {
"imports": [
"portable-net45+win8",
"dnxcore50"
]
} …Run Code Online (Sandbox Code Playgroud) 有没有办法获得HTML5 canvas元素的intellisense?在VS Code 0.7.10中,当我在我的JS代码中编写时:
context = document.getElementById(canvasId).getContext('2d');
Run Code Online (Sandbox Code Playgroud)
然后当我写
context.
Run Code Online (Sandbox Code Playgroud)
对于我的上下文,我没有任何intellisense帮助.
谢谢.
我第一次尝试使用 FileSavePicker,但是当我调用时,我不断收到“未指定的错误”,没有异常源 await picker.PickSaveFileAsync();
我注意到异常数据字典包含一个值“RestrictedErrorObject-{1F77CB5A-D22F-071F-2637-E6B7C7573653}”,所以我假设它以某种方式与权限相关。
var picker = new Windows.Storage.Pickers.FileSavePicker();
//picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
//picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads;
//picker.DefaultFileExtension = "csv";
//picker.FileTypeChoices.Add("CSV", new List<string>() { "*.csv" });
picker.SuggestedFileName = fileName;
StorageFile newFile = await picker.PickSaveFileAsync();
Run Code Online (Sandbox Code Playgroud) 我有一个asp.net应用程序,崩溃了.在包含此callstack的Windows事件日志中有一个条目:
Exception type: EntryPointNotFoundException
Exception message: Entry point was not found.
at ***.Interfaces.Portal.Repository.ILookup.get_LookupDataCollection()
at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup, Int32 index)
at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup)
at ***.HttpModules.RuntimeHttpModule.SetPageUrlInfoInContext(PageUrlInfo pinfo)
at ***PortalRuntime.HttpModules.RuntimeHttpModule.BeginRequest(Object sender, EventArgs e)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Run Code Online (Sandbox Code Playgroud)
这只发生在客户机器上,我无法在本地重现它.正如您在顶部看到的那样,有一个接口(ILookup实际上是一个接口,而不是一个类).
我构建了一个类似的示例(通过接口调用的方法).Visual Studio 2015非常智能,可以显示:
ConsoleApplication2.exe!ConsoleApplication2.Lookup.GetLookupId(ConsoleApplication2.ILookup lookup) Line 37 C#
Run Code Online (Sandbox Code Playgroud)
但是你仍然可以看到实现该方法的类.当应用程序位于通过接口调用的方法中的断点时,我还使用windbg附加到我的示例并打印堆栈:接口不在堆栈中.
这是我的问题:
在clr callstack中查看接口是否正常(特别是没有实现它的类)?我想我以前从未见过这样的一个callstack ......其他人?(我的意思是这一般,不管我的问题的第二部分)
这是一个非常相似的问题:@Hans Passant在他的第一条评论中说"未能解决接口方法的实现方法",OP说"你已经用你的第一条评论回答了我的问题".这真的是根本原因吗?有谁知道修复此问题?或者它只是一个特殊的CLR版本?
.net ×3
c# ×3
asp.net-core ×1
callstack ×1
clr ×1
dotnet-cli ×1
f# ×1
interface ×1
roslyn ×1
uwp ×1