我觉得好像在C#编译器中存在缺陷/不一致。C#方法通用参数参数错误?
这工作正常(第一种方法被调用):
public void SomeMethod(string message, object data);
public void SomeMethod(string message, params object[] data);
// ....
SomeMethod("woohoo", item);
然而,这会导致“的号召是以下方法之间的暧昧”的错误:
public void SomeMethod<T>(string message, T data);
public void SomeMethod<T>(string message, params T[] data);
// ....
SomeMethod("woohoo", (T)item);
我可以只使用转储第一种方法,但由于这是一个非常敏感的库,第一种方法将在大约75%的时间内使用,所以我宁愿不总是将东西包装在一个数组中,并实例化一个迭代器来遍历一个foreach,如果只有一个项目。
拆分成不同的命名方法最好是混乱的国际海事组织。
想法?
编辑:
我想安德鲁可能会到一些东西。
完整的示例:
public static class StringStuffDoer
{
public static string ToString<T>(T item1, T item2)
{
return item2.ToString() + item1.ToString();
}
public static string ToString<T>(T item, params T[] items)
{
StringBuilder builder = new StringBuilder();
foreach (T currentItem in items)
{
builder.Append(currentItem.ToString());
}
return item.ToString() + builder.ToString();
}
public static void CallToString()
{
ToString("someString", null); // FAIL
ToString("someString", "another string"); // SUCCESS
ToString("someString", (string)null); // SUCCESS
}
}
我仍然认为这是奇怪的是,需要投 - 呼叫一点也不含糊。它的工作原理是,如果用字符串或对象或任何非泛型类型替换T,那么为什么它不适用于泛型?它正确地找到了两种可能的匹配方法,所以我相信通过规范,它应该选择一个尽可能不使用参数的方法。如果我在这里错了,请纠正我。
(不那么)最后更新:
对不起,带你在这个tyraid家伙,我显然已经在这盯着太久......太多看仿制药,而params了一个晚上。非通用版本也会引发模糊错误,我只是在模型测试中关闭了方法签名。
REAL最后更新:
好吧,这就是为什么这个问题并没有在我的非通用测试显示出来。我使用“object”作为类型参数。 SomeMethod(object)和SomeMethod(params object [])不会抛出不明确的错误,我猜“null”会自动转换为“object”。我会说有点奇怪,但也许有点可以理解。
于是,奇怪的是,这个调用工作:
SomeMethod<object>("someMessage", null);
是item null? :s – 2010-05-18 09:40:00
请发布一个简短但完整的程序来演示问题,并告诉我们您正在使用哪个版本的C#。 – 2010-05-18 09:43:42
如果你不把物品投入到T中,它是如何工作的?如果在将项目声明为T型之前的某个时间点,它是否按照您的预期工作? – 2010-05-18 09:47:00