小编gre*_*pos的帖子

为什么Roslyn中的异步状态机类(而不是结构)?

让我们考虑一下这个非常简单的异步方法:

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中它还生成一个结构(具有该​​...的所有好处).所以这似乎是一个非常聪明的解决方案,支持编辑和继续以及更好的生产性能.有趣的东西,感谢所有参与的人!

.net c# language-lawyer roslyn

86
推荐指数
2
解决办法
3170
查看次数

C# - 在.NET Core上的Visual Studio 2015中的F#Interop支持

注意:这里我讲的是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上尝试过,同样的......

当我点击编译时,编译器会想出来,一切都很好.

这个截图总结了它(这是我从C#调用F#函数的地方): 在此输入图像描述

所以基本上我最终得到了VS解决方案,其中包含一堆错误,仍然可以编译.

是一个简单的复制器.

问题:

  1. 应该智能感知和调试在VS中工作吗?
  2. 如果是的话,我做错了什么?
  3. 如果不是,这个方案是否计划在未来涵盖?

以下是重现器的代码:

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)

.net f# visual-studio asp.net-core dotnet-cli

15
推荐指数
1
解决办法
1216
查看次数

Visual Studio Code中的HTML5 canvas intellisense

有没有办法获得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帮助.

谢谢.

visual-studio-code

8
推荐指数
3
解决办法
3286
查看次数

UWP FileSavePicker.PickSaveFileAsync() 抛出未指定的错误

我第一次尝试使用 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)

c# uwp

7
推荐指数
1
解决办法
1843
查看次数

在clr callstack中查看接口是否正常?

我有一个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 c# clr callstack interface

6
推荐指数
1
解决办法
109
查看次数