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.
}
我有如下内容:
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.
}