IntelliSense "Implement interface through private field" 添加了不必要的转换

IntelliSense "Implement interface through private field" adds unnecessary cast

我有如下内容:

public interface A {
    int Foo();
}
public class B : A {
    public int Foo() { return 5; }
}
public class C : A {
    private B bar;
}

这不会编译,Visual Studio 在 C 下加了一条红线;这是预料之中的。建议的解决方案之一是 Implement interface through 'bar'。当您单击它时,Visual Studio 会像这样填写 C

public class C : A {
    private B bar;
    public int Foo() { return ((A) bar).Foo() }
}

那个演员完全没有必要。我可以手动删除它,但在我的实际代码中,A 有几十种方法并且在不断变化;如果每次更改时,我都可以一键更新 C 而无需进行不必要的强制转换,那就太好了。在我的情况下,如果 IntelliSense 像这样填充它会更好:

public class C : A {
    private B bar;
    public int Foo { return bar.Foo(); }
}

有什么方法可以告诉 Visual Studio 这样做吗?

强制转换是必需的,因为此重构本质上是为接口创建代理,并且公开实际接口的方法是其中的重要部分。如果没有转换,您可能会调用错误的方法或完全无法编译。

代码将产生不同结果的示例:

public class B : A
{
    int A.Foo() { return 5; }
    public int Foo() { return 42; }
}
public class C : A
{
    private B bar = new B();
    public int Foo() { 
        return bar.Foo();  // returns 42 as it calls public method of B
        return ((A) bar).Foo(); // return 5 as it calls interface A imlplementation
    }
}

没有转换就无法编译的示例:

public class B : A
{
    int A.Foo() { return 5; }
}

public class C : A
{
    private B bar = new B();
    public int Foo() { return bar.Foo(); } // no public method Foo on B.
}