gpt4 book ai didi

c# - 为什么我被迫在未使用的构造函数中引用类型?

转载 作者:太空狗 更新时间:2023-10-29 21:11:00 25 4
gpt4 key购买 nike

假设我有一个类 (ClassA),其中包含一个调用另一个类的构造函数的方法,如下所示:

public class ClassA
{
public void CallClassBConstructor()
{
using(ClassB myB = new ClassB()) {...}
}
}

ClassB 类如下所示:

public class ClassB : IDisposable
{
public ClassB(){}
public ClassB(string myString){}
public ClassB(ClassC myC){}
public void Dispose() {...}
}

...ClassC 更简单:

public class ClassC{}

如果我将这些类放在它们自己的程序集中并编译整个解决方案,我不会收到任何错误。但是如果我用这个替换 using 语句:

using(ClassB myB = new ClassB("mystring")){...}

我收到一个编译错误,要求我在 ClassA 中添加对 [mynamespace].ClassC 的引用。因为我根本没有调用 ClassB(ClassC myC) 这对我来说毫无意义 - 为什么我必须包括其他构造函数的类型,无论我是否使用它们?如果 ClassC 包含在许可的或难以获得的程序集中怎么办?这是开发人员应该避免的不良设计示例还是我在这里遗漏了什么?

最佳答案

它与调用 ClassB 构造函数时的方法重载决策有关。

当你调用不带参数的构造函数时,没有争用。只有一个候选人,所以它被选中了。在这种情况下,ClassA 没有必要引用 ClassC

但是,当您使用一个参数调用构造函数时,那么一开始两个单参数构造函数都是候选者。为了解析这个调用,编译器需要知道ClassC。例如,就您所知,ClassC 可以包含一个隐式转换运算符。

(当然,我们知道在这个特定的例子中,这样一个隐式转换运算符无论如何都不会触发,因为有一个接受字符串的完美匹配——但是方法重载解析规则是这样定义的,使它们非常好——定义且可预测。想象一下,它的设计方式是添加引用可能会导致您的代码突然调用不同的构造函数重载。)

关于c# - 为什么我被迫在未使用的构造函数中引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com