为什么下面的代码会崩溃.NET编译器?它在csc.exe 4.0版上进行了测试.
请参阅此处以获取不同版本的在线演示 - 它以相同的方式崩溃,同时表示不支持动态https://dotnetfiddle.net/FMn59S:
编译错误(第0行,第0列):内部编译器错误(地址xy处的0xc0000005):可能的罪魁祸首是"TRANSFORM".
虽然扩展方法很好List<dynamic>.
using System;
using System.Collections.Generic;
static class F {
public static void M<T>(this IEnumerable<T> enumeration, Action<T> action){}
static void U(C.K d) {
d.M(kvp => Console.WriteLine(kvp));
}
}
class C {
public class K : Dictionary<string, dynamic>{}
}
Run Code Online (Sandbox Code Playgroud)
更新:这不会使编译器崩溃
static void U(Dictionary<string, dynamic> d)
{
d.M(kvp => Console.WriteLine(kvp));
}
Run Code Online (Sandbox Code Playgroud)
更新2:在http://connect.microsoft.com/VisualStudio/feedback/details/892372/compiler-error-with-dynamic-dictinoaries中报告了相同的错误.针对FirstOrDefault报告了该错误,但似乎编译器在应用于从Dictionary <T1,T2>派生的类的任何扩展方法上崩溃,其中至少有一个参数类型是dynamic.请参阅Erik Funkenbusch对以下问题的更一般描述.
更新3:另一种非标准行为.当我尝试将扩展方法作为静态方法调用时,也就是说F.M(d, kvp => Console.WriteLine(kvp));,编译器不会崩溃,但它无法找到重载:
Argument 1: cannot convert from 'C.K' to 'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>'
更新4 …
是否可以强制 C# 编译器在声明名称类时将其var视为关键字而不是类标识符var?
public class var
{
}
public class A
{
}
public class Program
{
public static void Main()
{
var a=new A{}; // Cannot implicitly convert type 'A' to 'var'
}
}
Run Code Online (Sandbox Code Playgroud)
为什么在下面的代码中尝试设置 X 的值时会出现 NullReferenceException?当我new在初始化时使用关键字时它工作正常B,但是为什么它可以在没有的情况下正常编译new然后在运行时失败?
https://dotnetfiddle.net/YNvPog
public class A
{
public _B B;
public class _B
{
public int X;
}
}
public class Program
{
public static void Main()
{
var a=new A{
B={
X=1
}
};
}
}
Run Code Online (Sandbox Code Playgroud)