开发者

Tuple.Create return type

开发者 https://www.devze.com 2023-01-19 07:17 出处:网络
Given void foo(Tuple<object> t) { } void bar() { foo(Tuple.Create(\"hello\")); } the c# compiler returns

Given

void foo(Tuple<object> t)
{

}
void bar()
{
    foo(Tuple.Create("hello"));
}

the c# compiler returns

error CS1502: The b开发者_开发百科est overloaded method match for 'foo(System.Tuple<object>)' has some invalid arguments
error CS1503: Argument 1: cannot convert from 'System.Tuple<string>' to 'System.Tuple<object>'

Adding explicit types to Tuple.Create defeats its purpose. How can I convince the compiler to accept the code?

FWIW, I think C++ doesn't have this problem: http://live.boost.org/doc/libs/1_33_1/libs/tuple/doc/tuple_users_guide.html#constructing_tuples


This is the same generic type covariance issue that comes up daily. It is simply not possible to convert Foo<T> to Foo<SubT> or vice-versa. Starting with .NET 4, it is supported - but only for interfaces and delegates, and by explicitly specifying the generic type parameter as variant by declaring it Foo<out T1>.


You can make the code compile by not using Tuple<object> but using Tuple<T>

void foo<T>(Tuple<T> t)

If you don't want to do that, you simply will need to be explicit with the string to object in the Tuple.Create method.

Tuple.Create<object>("Hello");
Tuple.Create((object)"Hello");

Consider if you could have Tuple<object> and then pass in a Tuple<string>. What if your signature was

void(ref Tuple<object> t)

There's nothing that stops you from writing in that method

t = new Tuple<object>(1);

And now you've just put a 1 in a tuple that only allows strings. Granted, it's a corner case as Tuple is inherently readonly so you need a ref parameter, but it's a problem case, nonetheless.


You are trying to turn a Tuple<string> into a Tuple<object>, which you cannot do - generic variance is only supported for interfaces and delegate. You need to explicitly specify the type arguments to Tuple.Create:

void bar()
{
    foo(Tuple.Create<object>("hello"));
}
0

精彩评论

暂无评论...
验证码 换一张
取 消