相关疑难解决方法(0)

.NET中的通用方法不能推断其返回类型.为什么?

鉴于:

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中发生变化,但事实并非如此.

任何人都知道为什么不能从泛型方法中推断出返回类型?这是其中一个问题,答案是如此明显,它正盯着你的脸?我希望不是!

.net c# type-inference

50
推荐指数
4
解决办法
5556
查看次数

为什么在泛型类中使用重复嵌套类型的字段声明会导致巨大的源代码增加?

场景非常罕见,但非常简单:定义一个泛型类,然后创建一个嵌套类,它继承自外部类并在嵌套中定义一个关联字段(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)

.net c# generics nested c#-4.0

39
推荐指数
3
解决办法
1435
查看次数

标签 统计

.net ×2

c# ×2

c#-4.0 ×1

generics ×1

nested ×1

type-inference ×1