C#6中的字符串插值让我写:
decimal m = 42.0m;
string x = $"The value is {m}";
Run Code Online (Sandbox Code Playgroud)
但是,字符串格式化的一个非常常见的用例是指定用于格式化值的语言环境.假设我需要InvariantCulture用于上面的格式化操作,那是什么语法?
这个讨论表明我应该能够做到这一点:
string x = INV($"The value is {m}");
Run Code Online (Sandbox Code Playgroud)
其中INV定义为
public static string INV(IFormattable formattable)
{
return formattable.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.它编译,但它启动时我的程序挂在cmd.exe中 - 好像我假设正在调用klr.exe,挂起(编译器错误?)
这是VS15 CTP 6中的ASP.NET 5控制台项目.
我正面临一个来自roslyn编译器的奇怪问题.有时当我构建解决方案时,我在错误列表中面临一个奇怪的问题,这不会让我构建解决方案.这是错误:
严重级代码说明项目文件行抑制状态错误无法将文件"D:\ Sealogical New Website\SealogicalWebsite\packages\Microsoft.Net.Compilers.1.0.0\tools\csc.exe"复制到"bin\roslyn\csc.exe" ".访问路径'bin\roslyn\csc.exe'被拒绝.SealogicalWebsite
严重级代码说明项目文件行抑制状态错误无法将文件"D:\ Sealogical New Website\SealogicalWebsite\packages\Microsoft.Net.Compilers.1.0.0\tools\VBCSCompiler.exe"复制到"bin\roslyn\VBCSCompiler.exe" ".访问路径'bin\roslyn\VBCSCompiler.exe'被拒绝.SealogicalWebsite
我尝试清理解决方案并重建它但不再工作.
试图手动删除文件,但再次显示错误指出我没有权限执行此操作:
尝试删除CMD但再次显示相同的错误:
删除roslyn生成的文件的唯一方法是重新启动PC,重启后我可以手动删除它们没有问题.
我是我的电脑的管理员,所以我猜没有问题.
这个问题似乎发生在Visual Studi0 2015和Visual Studio 2017中.
我不喜欢每天重启PC 4-5次或更多,这就是我在这里问的原因.
其他一些细节:
我是创建这个项目的人,所以理论上做这个动作应该不是问题.
当项目第一次创建时,我确实以管理员模式运行Visual Studion,正如我现在所做的那样.
bin/roslyn/csc和bin/roslyn/VBCSCompiler.我可以找到一个从web.config中删除此部分的解决方案,因此它不会生成这些文件:
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案会导致新的c#6功能出现问题,所以我无法删除此部分.....
此外,我在CMD中尝试了这个命令来查看是否存在锁定此文件的进程,但无论如何它根本没有显示任何进程:
C:\WINDOWS\system32>tasklist /m D:\SealogicalNewWebsite\SealogicalWebsite\SealogicalWebsite\bin\roslyn\csc.exe
INFO: No tasks are running which match the specified criteria. …Run Code Online (Sandbox Code Playgroud) 当在Roslyn中引入操作时,其中一个目标是提供降低的操作(我认为这是在设计审查会议视频中),据我所知,应该为高级别的隐式编译器操作提供显式操作.我在Roslyn看到了Lowering目录,但是那里的类是内部的.现在可以降低操作或没有公共API可用吗?
在下面的示例中,已经删除了一些隐式部分 - 为表达式主体添加return语句并为重载运算符公开符号.但前后增量仅因种类而异.
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Semantics;
using System.Linq;
namespace so39468373
{
internal static class Program
{
private static void Main()
{
var tree = CSharpSyntaxTree.ParseText(@"
public class c
{
public static c operator ++(c o) { return o; }
static c pre(c o) => ++o;
static c post(c o) => o++;
public static void Main() {}
}");
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create(null, new[] { tree }, new[] { mscorlib });
var …Run Code Online (Sandbox Code Playgroud) 使用Roslyn,我想在实际编译之前修改我的C#代码.现在,我只需要:
[MyAnotatedMethod]
public void MyMethod()
{
// method-body
}
Run Code Online (Sandbox Code Playgroud)
并且基于注释,我想在方法的开头和方法的末尾注入一些代码.
我知道PostSharp,但那不是我想要的.
这可能与罗斯林有关吗?如果是的话,你能举个例子吗?
既然我们有枚举约束,为什么编译器不允许我编写这段代码?
public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
where TResult : Enum
{
return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
Run Code Online (Sandbox Code Playgroud)
编译器说:
错误CS0453类型'TResult'必须是非可空值类型才能在泛型类型或方法'Nullable'中将其用作参数'T'
更新1:
在将visual studio更新到2015版更新2 RTM之后,问题仍然存在.
2016年4月12日更新2补丁:
感谢Patrick Nelson.
补丁已经发布
你可以在这里下载补丁.
2016年8月16日更新:
最新vs 2015更新3 KB3165756有同样的问题不要更新
使用版本:
visual studio update 2 rc上的最新稳定版本
禁用我的所有扩展程序,并重新启动我的所有设置
重现步骤:
预期行为:
实际行为:
我无法在visual studio编辑器或即时窗口中探索变量的上下文,我在即时窗口中收到以下错误
我一直在研究Visual Studio 14 CTP和C#6.0以及使用零传播运算符.
但是,我找不到为什么以下代码无法编译.这些功能尚未记录,所以我不确定这是一个错误还是扩展方法,?.操作员不支持这些方法并且错误消息具有误导性.
class C
{
public object Get()
{
return null;
}
}
class CC
{
}
static class CCExtensions
{
public static object Get(this CC c)
{
return null;
}
}
class Program
{
static void Main(string[] args)
{
C c = null;
var cr = c?.Get(); //this compiles (Get is instance method)
CC cc = null;
var ccr = cc?.Get(); //this doesn't compile
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息是:
'ConsoleApplication1.CC'不包含'Get'的定义,也没有扩展方法'Get'接受类型'ConsoleApplication1.CC'的第一个参数(你是否缺少using指令或汇编引用?)
C#Interactive似乎比立即窗口更强大(至少它处理LINQ中经常使用的lambda表达式 - 请参阅Visual Studio调试"快速监视"工具和lambda表达式),但看起来它不能用作一个替代品,因为它不知道调试器上下文.有没有办法访问调试器上下文?
我已经看到在F#中获取调试器上下文,它可能需要相同的东西,但也许有新的/不同的东西可用.
http://extendedimmediatewin.codeplex.com/可能很有用,但看起来已经死了,虽然有人在2011年10月18日说他打算将它移植到VB.Net(http://extendedimmediatewin.codeplex.com/discussions/75589).
c# ×10
roslyn ×10
c#-6.0 ×2
.net ×1
asp.net-core ×1
asp.net-mvc ×1
c#-7.3 ×1
debugging ×1
enums ×1
mono ×1