我在针对.NET 4.0的项目中进行了以下测试:
[TestFixture]
public class Donkey
{
[Test]
public void TestListSorting()
{
var expected = new[]
{
MockRepository.GenerateStub<IComparable>(),
MockRepository.GenerateStub<IComparable>()
};
var sorted = new List<IComparable>(expected);
CollectionAssert.AreEqual(expected, sorted);
sorted.Sort();
CollectionAssert.AreEqual(expected, sorted);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在仅安装了.NET 4.0的计算机上运行它,则会失败.如果我在只安装了.NET 4.5的机器上运行它,它会通过.
我假设在.NET 4.5的实施Sort已更改排序对象,每个返回列表时维持秩序0的CompareTo.
现在,抛开这个测试的明显疯狂.我知道依靠这种行为是很疯狂的.
当然这是一个突破性的变化?本页未列出.NET 4.0和4.5之间的兼容性.
是否有一个原因?我错过了什么吗?是否有其他页面显示实际的重大变化?我应该坐下来停止恐慌吗?
我们正在将应用程序迁移到.NET 4.0(从3.5开始).我们遇到的一个问题只能在非常特殊的条件下重现:
我的意思是,如果我禁用优化并将调试信息设置为完整,问题就会消失.
有问题的代码在.NET 3.5上工作正常,在发布模式下启用了优化等,并且已经做了很长时间.
我真的不想暗示C#编译器中存在错误,所以我的问题是我是否有任何技术可以用来追踪我们可能做错的导致错误优化的方法?
我正在尝试将此问题缩小到一个小的测试用例,所以我可以在这里发布一些代码.
编辑:
我已将问题追溯到以下问题:
我们在Form的构造函数中有这个代码:
public ConnectionForm()
{
LocalControlUtil.Configure("ConnectionForm", "Username", usernameLabel);
LocalControlUtil.Configure("ConnectionForm", "Password", passwordLabel);
LocalControlUtil.Configure("ConnectionForm", "Domain", domainLabel);
LocalControlUtil.Configure("ConnectionForm", "Cancel", cancelButton);
LocalControlUtil.Configure("ConnectionForm", "OK", okButton);
}
Run Code Online (Sandbox Code Playgroud)
这些调用是一些自定义本地化代码.从另一个程序集调用此表单的构造函数.该LocalControlUtil.Configure方法调用Assembly.GetCallingAssembly(),它返回上述所有通话的正确值,除了最后一个.
我可以重新排序上面的行,添加新行或删除当前行,每次它是最后一行不起作用.
我假设这是JIT内联调用构造函数的地方的最后一个方法调用(在另一个程序集中).添加[MethodImpl(MethodImplOptions.NoInlining)]到上面的构造函数可以解决问题.
有人知道为什么会这样吗?对我来说似乎很奇怪,最后一行只能内联.这是.NET 4.0中的新行为吗?
编辑2:
我现在把它缩小到尾部调用消除,我假设是由.NET 4中新的尾调用引起的.
在上面的代码LocalControlUtil.Configure中,构造函数中的最后一次调用被消除并放入调用方法,该方法位于另一个程序集中.当方法调用时Assembly.GetCallingAssembly,我们没有得到正确的程序集.
有没有办法阻止编译器(或JIT或其他任何东西)消除尾调用?
我在PowerShell的命令行中使用git,我正在尝试使用类似的东西
git difftool HEAD^
Run Code Online (Sandbox Code Playgroud)
Powershell似乎对待这就像我打字一样
git difftool HEAD
Run Code Online (Sandbox Code Playgroud)
所以插入符号消失了.如果我使用插入符号的多个副本,我会得到一个奇怪的错误:
git difftool HEAD^^
fatal: ambiguous argument 'HEAD@set': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Run Code Online (Sandbox Code Playgroud)
有趣的是,连续使用四个插入符号似乎可以逃逸到一个,所以git difftool HEAD^^^^按照我期望的git difftool HEAD^方式工作.
我尝试用单引号,双引号,严重的口音来逃避插入符号,似乎没有任何帮助.
这是PowerShell的一个功能,还是我的设置错了?
我刚刚注意到在Visual Studio 2015中编写的C#中可以使用以下内容,但我以前从未见过它:
public class X
{
public int A { get; set; }
public Y B { get; set; }
}
public class Y
{
public int C {get; set; }
}
public void Foo()
{
var x = new X { A = 1, B = { C = 3 } };
}
Run Code Online (Sandbox Code Playgroud)
我的期望是Foo必须像这样实现:
public void Foo()
{
var x = new X { A = 1, B = new Y { C = 3 } };
} …Run Code Online (Sandbox Code Playgroud) 在Windows XP计算机上,以下代码抛出System.ComponentModel.Win32Exception,并显示消息"操作已成功完成"
System.Drawing.Icon icon = new System.Drawing.Icon("icon.ico");
Run Code Online (Sandbox Code Playgroud)
我可以阻止程序崩溃
try
{
System.Drawing.Icon icon = new System.Drawing.Icon("icon.ico");
}
catch(System.ComponentModel.Win32Exception ex)
{
if (ex.NativeErrorCode != 0)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
但当然没有设置图标.
完整的堆栈跟踪是
at System.Drawing.Icon.Initialize(Int32 width, Int32 height)
at System.Drawing.Icon..ctor(String fileName, Int32 width, Int32 height)
at System.Drawing.Icon..ctor(String fileName)
at hermes.Window1..ctor() in D:\\projects\\hermesclient\\hermesWPF\\hermes\\Window1.xaml.cs:line 50"
Run Code Online (Sandbox Code Playgroud)
第50行是我发布的原始行.
这是一个WPF应用程序,在Windows 7机器上,代码工作正常.
编辑:原来这个图标在Windows XP中根本不起作用,添加256色版本似乎已经修复了它.
我有一个表单中的文本框,需要接受带有HTML标记的输入.
使用HTML标签提交输入会使应用程序抛出HttpRequestValidationException,除非我们使用HttpUtility.HtmlEncode.容易到目前为止.
但是,输入也可能包含符号,例如"度"符号(°).当这些也是HTML编码时,在这个例子中它们变成数字转义码°.这些代码也会导致HttpRequestValidationException抛出,但问题是为什么?
我不明白为什么数字转义码被认为是潜在的危险,特别是°作为输入工作就好了.
我似乎被卡住了,因为由于标签而导致输入失败,并且由于数字转义而导致输入的HTML编码失败.到目前为止我的解决方案是HTML编码,然后正则表达式用它们的HTML解码形式替换转义序列,但我不确定这是否是一个安全的解决方案,因为我认为转义序列被视为危险的原因.
c# ×5
.net ×3
.net-4.0 ×2
.net-4.5 ×1
asp.net ×1
c#-6.0 ×1
exception ×1
git ×1
icons ×1
optimization ×1
powershell ×1
roslyn ×1
validation ×1
windows ×1