Tag: compiler bug

为什么这个协方差声明会编译?

考虑这个界面: interface Test where T : struct { } 它编译时没有错误或警告。 如本问题所述 ,并在协方差和反演法常见问题中提到: 仅当类型参数是引用类型时才支持差异。 那么为什么上面的接口编译? 对“out”关键字失败(或至少警告)是有意义的。 我想这个问题归结为 – 在上面的例子中使用out关键字是否有任何区别? 更新 :这是一个误导性行为的示例,可能会让那些看不到上面界面的不知情的开发人员漏掉: typeof(IDummy).IsAssignableFrom(typeof(MyStruct)); // should return true typeof(ITest).IsAssignableFrom(typeof(ITest)); // returns false 如果编码器不知道方差不适用于值类型,他们会期望第二行返回true – 因为out关键字 – 但它永远不会。 这正是导致我提出这个问题的错误…… 另一个可编译但产生意外结果的代码示例 : ITest foo = …; var casted = (ITest)foo; 我希望这可以工作(不知道协方差对引用类型的限制),但它会导致System.InvalidCastException。

C#编译器错误? 用于Expression中的只写属性的对象初始化程序语法使csc崩溃

您可能会认为这是一个错误报告,但是我很好奇我是否在这里非常错误,或者是否有来自Eric或Microsoft的其他人的解释。 更新 现在,这是作为 Microsoft Connect上的错误发布的 。 描述 考虑以下课程: class A { public object B { set { } } } 这里, AB是一个只写但其他方面很好的属性。 现在,想象一下我们在表达式中分配它 : Expression<Func> expr = () => new A { B = new object { } }; 此代码使C#编译器( 3.5 .30729.4926和4.0 .30319.1)吐出 内部编译器错误(地址013E213F处的0xc0000005):可能的罪魁祸首是“BIND”。 和崩溃。 但是, 仅使用构造函数( ( ) )替换对象初始化程序语法( { } )就可以了 。 完整的复制代码: […]

在构建将operator ==提升为可空的表达式时,为什么generics和非generics结构的处理方式不同?

这看起来像是在通用结构上提升为操作数的null的错误。 考虑以下伪结构,它覆盖operator== : struct MyStruct { private readonly int _value; public MyStruct(int val) { this._value = val; } public override bool Equals(object obj) { return false; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(MyStruct a, MyStruct b) { return false; } public static bool operator !=(MyStruct a, MyStruct b) […]

为什么这个generics场景会导致TypeLoadException?

这有点啰嗦,所以这是快速版本: 为什么这会导致运行时TypeLoadException? (并且编译器是否应该阻止我这样做?) interface I { void Foo(); } class C { public void Foo() where T2 : T1 { } } class D : C, I { } 如果您尝试实例化D,则会发生exception。 更长,更具探索性的版本: 考虑: interface I { void Foo(); } class C { public void Foo() where T2 : T1 { } } class some_other_class { } […]

可能是Visual Studio 2015中的C#编译器错误

我认为这是一个编译错误。 使用VS 2015编译时,以下控制台应用程序编译并执行完美: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var x = MyStruct.Empty; } public struct MyStruct { public static readonly MyStruct Empty = new MyStruct(); } } } 但现在它变得很奇怪:这段代码编译,但是在执行时会抛出一个TypeLoadException 。 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var x = MyStruct.Empty; } public struct MyStruct […]