gpt4 book ai didi

C# 类型推断、泛型和接口(interface)

转载 作者:太空狗 更新时间:2023-10-30 00:14:07 25 4
gpt4 key购买 nike

我在 C# 的类型推断中发现了一些对我来说很奇怪的东西。

例子。

我有一个界面

interface IInterface1
{
}

和一个实现接口(interface)的类

class Class1 : IInterface1
{
}

然后我有一个创建类的函数

static Class1 GetInstanceOfClass1()
{
return new Class1();
}

我想使用将返回可枚举的通用函数

static IEnumerable<T> GetSomething<T>() where T : IInterface1
{
yield return GetInstanceOfClass1();
}

完整代码为

using System.Collections.Generic;

namespace TypeInference
{
interface IInterface1
{
}

class Class1 : IInterface1
{
}

class Program
{
static Class1 GetInstanceOfClass1()
{
return new Class1();
}

static IEnumerable<T> GetSomething<T>() where T : IInterface1
{
yield return GetInstanceOfClass1();
}

static void Main(string[] args)
{
}
}
}

这段代码没有编译

Cannot implicitly convert type 'TypeInference.Class1' to 'T'

如果我写成

yield return (T)GetInstanceOfClass1();

错误信息如下

Cannot convert type 'TypeInference.Class1' to 'T'

它不能像以前那样转换。

好的。我写成

yield return (IInterface1)GetInstanceOfClass1();

得到了

Cannot implicitly convert type 'TypeInference.IInterface1' to 'T'

它不能像以前那样转换。

但是如果我写成

yield return (T)(IInterface1)GetInstanceOfClass1();

一切正常

有人可以向我解释哪里出了问题以及代码最终被编译的原因吗?

谢谢。

最佳答案

这是为了防止自己搬起石头砸自己的脚。就像你最终设法做到的那样。

如果你定义会发生什么

interface IInterface2 : IInterface1 { }

然后调用GetSomething<IInterface2>() ?这是一个有效的泛型类型参数,但是 Class1没有实现 IInterface2 .

更糟糕的是,如果你定义会发生什么

class Class2 : IInterface1 { }

然后调用GetSomething<Class2>()

您的设计已损坏,您需要多加考虑,不要继续解决编译器错误,直到您有一个真正有机会工作的设计。

关于C# 类型推断、泛型和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com