gpt4 book ai didi

c# - 使用泛型属性调用重载方法会调用错误的重载

转载 作者:太空狗 更新时间:2023-10-30 00:40:35 24 4
gpt4 key购买 nike

我有一个基本的过滤器类,它存储一个 string 参数名称和一个通用的 T 值。过滤器有一个方法 Write(writer As IWriter),它将过滤器的内容写入 HTML 页面。 Write 方法有两个重载,一个接受两个字符串,另一个接受一个字符串和一个对象。这让我可以自动引用字符串。

问题是,当我调用 writer.Write(ParameterName, Value) 并且 T 是一个 string 时,它会调用重载字符串/对象,而不是字符串/字符串!如果我直接在 writer 上调用 Write 方法,它会按预期工作。

这是 C# 中的 SSCE。我在 VB 和 C# 中测试了这个,发现了同样的问题

void Main() {
FooWriter writer = new FooWriter();

Filter<string> f = new Filter<string>() {ParameterName = "param", Value = "value"};

f.Write(writer); //Outputs wrote w/ object
writer.Write(f.ParameterName, f.Value); //Outputs wrote w/ string
}

class FooWriter {
public void Write(string name, object value) {
Console.WriteLine("wrote w/ object");
}

public void Write(string name, string value) {
Console.WriteLine("wrote w/ string");
}
}

class Filter<T> {
public string ParameterName {get; set;}
public T Value {get; set;}

public void Write(FooWriter writer) {
writer.Write(ParameterName, Value);
}
}

最佳答案

The problem is, when I call writer.Write(ParameterName, Value) and T is a string, it calls the overload for string/object, not string/string!

是的,这是预期的 - 或者更确切地说,它的行为符合规定。编译器通常根据参数的编译时 类型选择重载。没有从 Tstring 的隐式转换,因此调用 writer.Write(ParameterName, Value) 的唯一适用候选者是 Write(string, object) 重载。

如果你想让它在执行时进行重载解析,你需要使用动态类型。例如:

public void Write(FooWriter writer) {
// Force overload resolution at execution-time, with the execution-time type of
// Value.
dynamic d = Value;
writer.Write(ParameterName, d);
}

请注意,这仍然可能会出现意外行为 - 如果 Value 为 null,则它等同于调用 writer.Write(ParameterName, null),它将使用“更好的”函数成员 - 这里 writer.Write(string, string) - 即使 T 的类型是 object!

关于c# - 使用泛型属性调用重载方法会调用错误的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26470484/

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