泛型类构造函数匹配优先级:为何string参数构造函数被优先调用?
C#泛型类构造函数调用问题解答
1. 现象原因
C#的重载解析规则会优先选择更具体、非泛型的重载版本。当实例化GenericClass<string>时,T被替换为string,此时两个构造函数都能接收string类型参数,但接收string参数的构造函数是显式定义的非泛型重载,比泛型实例化后的T参数重载(此时T等价于string)更“具体”。编译器会直接选择这个更匹配的重载,因此不会触发歧义错误,始终调用该构造函数。
2. 调用泛型构造函数的方法
有三种可行的方式来明确调用接收T参数的泛型构造函数:
方式1:使用命名参数指定参数名
通过指定构造函数的参数名,让编译器明确匹配目标构造函数:
new GenericClass<string>(data: "some data");
方式2:通过类型转换引导编译器匹配
将参数先转换为object再转为T,强制编译器选择泛型构造函数:
new GenericClass<string>((T)(object)"some data");
方式3:添加静态工厂方法
在泛型类中新增静态工厂方法,封装对泛型构造函数的调用:
public class GenericClass<T> { public T Data { get; set; } public string ErrorMessage { get; set; } public GenericClass(T data) { Data = data; } public GenericClass(string errorMessage) { ErrorMessage = errorMessage; } // 新增工厂方法 public static GenericClass<T> FromData(T data) { return new GenericClass<T>(data); } }
调用时直接使用工厂方法:
GenericClass<string>.FromData("some data");
内容的提问来源于stack exchange,提问作者Feargal Kavanagh
相关产品推荐
相关产品推荐

