使用generics属性调用重载方法会调用错误的重载。过滤器有一个方法Write(writerAsIWriter),它将过滤器的内容写入HTML页面。Write方法有两个重载,一个有两个字符串,它接受一个字符串和一个对象。这让我自动引用字符串。问题是,当我调用writer.Write(ParameterName,Value)并且T是一个字符串时,它会调用字符串/对象重载,而不是字符串/字符串!如果我直接在writer上调用Write方法,它会按预期工作。这是C#中的SSCE。我在VB和C#中对此进行了测试,发现了同样的问题voidMain(){FooWriterwriter=newFooWriter();Filterf=newFilter(){ParameterName="param",Value="value"};f.Write(作家);//输出写入w/objectwriter.Write(f.ParameterName,f.Value);//输出writew/string}classFooWriter{publicvoidWrite(stringname,objectvalue){Console.WriteLine("wrotew/object");}publicvoidWrite(stringname,stringvalue){Console.WriteLine("wrotew/string");}}classFilter{publicstringParameterName{get;设置;}公共T值{get;设置;}publicvoidWrite(FooWriterwriter){writer.Write(ParameterName,Value);问题是,当我调用writer.Write(ParameterName,Value)并且T是一个字符串时,它会调用字符串/对象的重载,而不是字符串/字符串!是的,这是预期的-或者更确切地说,它的行为符合规定。编译器通常根据参数的编译时类型选择重载。没有从T到字符串的隐式转换,因此调用writer.Write(ParameterName,Value)的唯一适用候选者是Write(string,object)重载。如果你想让它在执行时做重载解析,你需要使用动态类型。例如:publicvoidWrite(FooWriterwriter){//在执行时强制重载解析,执行时类型为//Value.dynamicd=Value;writer.Write(ParameterName,d);请注意,这种意外行为仍然是可能的-如果Value为null那么它将等效于调用writer.Write(ParameterName,null)它将使用“更好”的函数成员-这里writer.Write(string,string)-即使对象的类型!以上是C#学习教程:使用泛型属性调用重载方法会调用错误的重载。分享的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
