鉴于:
static TDest Gimme<TSource,TDest>(TSource source)
{
return default(TDest);
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能这样做:
string dest = Gimme(5);
Run Code Online (Sandbox Code Playgroud)
没有得到编译器错误:
error CS0411: The type arguments for method 'Whatever.Gimme<TSource,TDest>(TSource)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
该5可以推断为int,但有编译器将不会/无法解决的返回类型的限制string.我在几个地方读到这是设计但没有真正的解释.我在某处读过这可能会在C#4中发生变化,但事实并非如此.
任何人都知道为什么不能从泛型方法中推断出返回类型?这是其中一个问题,答案是如此明显,它正盯着你的脸?我希望不是!
场景非常罕见,但非常简单:定义一个泛型类,然后创建一个嵌套类,它继承自外部类并在嵌套中定义一个关联字段(self类型).代码片段比描述更简单:
class Outer<T>
{
class Inner : Outer<Inner>
{
Inner field;
}
}
Run Code Online (Sandbox Code Playgroud)
在反编译IL之后,C#代码如下所示:
internal class Outer<T>
{
private class Inner : Outer<Outer<T>.Inner>
{
private Outer<Outer<T>.Inner>.Inner field;
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来很公平,但是当你改变字段的类型声明时,事情变得更加棘手.所以当我将字段声明更改为
Inner.Inner field;
Run Code Online (Sandbox Code Playgroud)
反编译后,此字段将如下所示:
private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field;
Run Code Online (Sandbox Code Playgroud)
我明白,这个类'嵌套'和继承彼此并不相处,但为什么我们会观察到这种行为呢?在 Inner.Inner 类型声明已经发生任何变化的类型?是 Inner.Inner 和 Inner 类型,在此情况下某种方式有什么不同?
您可以在下面看到该类的反编译源代码.它非常庞大,总长度为12159个符号.
class X<A, B, C>
{
class Y : X<Y, Y, Y>
{
Y.Y.Y.Y.Y.Y y;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,这堂课:
class X<A, B, C, D, E>
{
class Y : X<Y, Y, Y, Y, Y> …Run Code Online (Sandbox Code Playgroud)