代码之家  ›  专栏  ›  技术社区  ›  Dave Archer

为什么生成的泛型方法重写代码不正确?

  •  2
  • Dave Archer  · 技术社区  · 16 年前

    我有一个抽象泛型类

    public abstract class Foo<TType>
    

    public abstract object DoSomething(TType arg = default(TType)) {}
    

    现在,继承的类

    public class BabyFoo : Foo<string>
    

    当我想重写DoSomething并开始键入“override”以让intellisense/generator编写我期望的方法框架时

    public override object DoSomething(string arg = default(string))
    

    甚至

    public override object DoSomething(string arg = null)
    

    但事实上

    public override object DoSomething(string arg = default(TType))
    

    我最初的想法是这是一个VS2010错误,因为可选参数对c#来说是新的,但是有人能告诉我IDE生成这段代码的真正原因(引用类型vs值类型??)吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Rob    16 年前

    只是想澄清一下:

    public abstract class Foo<TType>
    {
        public abstract object DoSomething(TType arg = default(TType));
    }
    
    public class BabyFoo : Foo<string>
    {
        // Expected:
        public override object DoSomething(string arg = default(string))
        // Actual:
        public override object DoSomething(string arg = default(TType));
    }
    

    除非我遗漏了什么,否则这只是visualstudio IDE/code-gen中的一个bug。将方法签名更改为“预期”签名将导致代码将被编译,因为“实际”签名由于明显无效而拒绝编译。

    试过几种不同的类型 TType where TType : new() 约束,我无法让VS生成有效的代码 DoSomething 方法。

    恭喜-您(可能)在Visual Studio()中发现了一个错误

    当涉及到代码生成时,总是有一些边缘情况,我记录到 one for Visual Basic 2005/2008 比较晦涩的。希望这个能修好!