我在下面展示的是一个理论问题.但我对新的C#7编译器如何工作并解析本地函数感兴趣.
在C#7中,我可以使用本地函数.例如(您可以在LinqPad beta中尝试这些示例):
示例1:嵌套Main()
void Main()
{
void Main()
{
Console.WriteLine("Hello!");
}
Main();
}
Run Code Online (Sandbox Code Playgroud)
而不Main()
是以递归方式调用,本地函数Main()
被调用一次,因此它的输出是:
你好!
编译器接受此操作时没有警告和错误.
示例2: 在这里,我更深入一级,如:
void Main()
{
void Main()
{
void MainL()
{
Console.WriteLine("Hello!");
}
MainL();
}
Main();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我也期望相同的输出,因为最里面的本地函数被调用,然后一个级别,Main()
只是另一个具有局部范围的本地函数,所以它应该与第一个示例没有太大的不同.
但令我惊讶的是,我收到了一个错误:
CS0136无法在此范围内声明名为"Main"的本地或参数,因为该名称用于封闭的本地范围以定义本地或参数
问题: 您能解释为什么在例2中发生此错误,但在示例1中没有?
我想,每个内部Main()
都有一个局部范围,并隐藏在外面.
更新: 感谢所有到目前为止已经提出建议的人(无论是答案还是评论),你为了解C#编译器的行为而写的是非常值得的.
根据我的阅读,在考虑了可能性之后,我在你的帮助下发现它可能是编译器错误或设计行为.
回想一下,C#有一些设计目标,可以将它与C++等语言区分开来.
如果你对我所做的事情有兴趣进一步研究它:我已经将最里面的函数重命名为MainL
:
例2b:
IL_0000: call UserQuery.<Main>g__Main0_0
IL_0005: ret
<Main>g__Main0_0:
IL_0000: call UserQuery.<Main>g__Main0_1
IL_0005: ret
<Main>g__Main0_1:
IL_0000: ldstr "Hello!"
IL_0005: call System.Console.WriteLine
IL_000A: …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始nameof()
在我的项目中使用C#6.0 的运算符.现在(在办理登机手续时,呃...)我(或更好:构建代理)拒绝构建项目(本地编译就好了),因为它无法找到nameof()
表达式.
我开始在构建控制器和TFS服务器本身上安装VS 2015,但无济于事.如何让我的TFS 2013 Update 5构建具有C#6.0功能的项目?
我已经考虑过编辑BuildProcessTemplate,但我们在所有构建定义中一直使用默认模板,我甚至不知道这是否是正确的方法.
在C#7中,你被允许这样做
if (int.TryParse("123", out int result))
Console.WriteLine($"Parsed: {result}");
Run Code Online (Sandbox Code Playgroud)
或者 - 如果您不使用结果并且只想检查解析是否成功,则丢弃out值:
if (int.TryParse("123", out _))
Console.WriteLine("Syntax OK");
Run Code Online (Sandbox Code Playgroud)
这通常很好,但在Visual Studio 2017中,out
参数为空的第二个示例生成警告
警告AD0001:Analyzer'Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTypeNamesDiagnosticAnalyzer'抛出了类型为'System.NullReferenceException'的异常,并显示消息'对象引用未设置为对象的实例.'.
我可以验证它发生的Visual Studio版本是
Visual Studio Enterprise 2017版本15.1(26403.7)发布
Visual Studio Enterprise 2017版本15.2(26430.4)发行版
这是一个错误,还是使用int.TryParse("123", out _)
不正式支持?到目前为止我找不到任何暗示.
为了完整起见,这是显示问题的控制台应用程序的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
if (int.TryParse("123", out _))
Console.WriteLine("Syntax OK");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个设置项目的小应用程序.如果我创建了一个主输出的快捷方式,那么这将获得一个标准的Win7图标,而不是我的exe的应用程序图标中指定的图标?
什么是最好的方法来确保我的桌面快捷方式图标与我的exe相同的图标?例如,如果我更改了exe的图标,那么我也希望设置图标也能改变.
我正在开发一个Web应用程序,它需要一个用户名和密码存储在web.Config中,它还指的是一些URL将由Web应用程序本身而不是客户端请求.
我知道.Net框架不允许提供web.config文件,但我仍然认为将此类信息保留为纯文本是不好的做法.
到目前为止我读过的所有内容都要求我使用命令行开关或将值存储在服务器的注册表中.我可以访问这两个,因为主机在线,我只有FTP和控制面板(helm)访问.
任何人都可以推荐任何好的,免费的加密DLL或我可以使用的方法吗?我宁愿不发展自己的!
感谢您的反馈到目前为止,但我无法发出命令,也无法编辑注册表.它必须是一个加密工具/助手,但只是想知道哪一个!
我正在寻找一种方法来存储可以使用应用程序设置在运行时写入的应用程序或机器级别设置.用户设置允许读/写,但应用程序设置不允许.我一直在使用用户设置在运行时保存这样的设置,但由于以下原因,这已被证明是不切实际的:
我们公司的机器仅供一个用户使用,因此通常不需要用户特定的设置.
否则我真的很喜欢使用应用程序设置,并希望尽可能继续使用它们.如果设置可以与EXE位于同一个文件夹中(比如曾经做过的好的'ini文件),那将是理想的选择.
注意:这是一个WPF应用程序,而不是ASP.net Web应用程序,所以没有web.config.
我在项目的根目录中有一个母版页.我在整个项目中以及引用此母版页的子文件夹中都有内容页面.如果我总是希望它们相对于根目录,那么引用我的.CSS和.JS文件的正确方法是什么?
我现在就是这样做的:
link href="/common/css/global.css" script src="/common/javascript/global.js"
但这打破了联系.我尝试没有前导"/"但是在子文件夹中我的页面上没有用.
是否可以定义一个同时是运算符的扩展方法?我想要一个固定的类添加使用实际上无法应用的已知运算符的可能性.对于这种特殊情况,我想这样做:
somestring++; //i really know that this string contains a numeric value
Run Code Online (Sandbox Code Playgroud)
我不想为所有代码传播类型转换.我知道我可以在字符串上创建包装类并定义该运算符但我想知道这种事情是否可以避免使用MySpecialString搜索和替换每个字符串声明.
编辑:因为大多数人说字符串是密封的,所以推导是不可能的,所以我修改"派生"到"包装",我的错误.
C#中是否有任何方法IndexOf或Contains.以下是代码:
var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();
if (sb.ToString().Contains("def"))
{
sb.Replace("def", "aa");
}
if (sb.ToString().Contains("ghi"))
{
sb.Replace("ghi", "assd");
}
Run Code Online (Sandbox Code Playgroud)
你可能已经注意到我一次又一次地使用ToString(),我想避免它,因为它每次都在创建新的字符串.你能帮帮我怎样才能避免它?
string[] arrTopics = {"Health", "Science", "Politics"};
Run Code Online (Sandbox Code Playgroud)
我有一个if语句,如:
if (arrTopics.Count() != null)
Run Code Online (Sandbox Code Playgroud)
当我将鼠标悬停在上述语句上时,它说:
警告CS0472:表达式的结果始终为true,因为int类型的值永远不等于int类型的null?
我无法弄清楚为什么这么说.有谁能够帮我?
c# ×8
.net ×3
appsettings ×2
c#-7.0 ×2
app-config ×1
arrays ×1
asp.net ×1
c#-6.0 ×1
encryption ×1
function ×1
javascript ×1
jquery ×1
msbuild ×1
nested ×1
operators ×1
scope ×1
security ×1
tfs ×1
winforms ×1
wpf ×1