gpt4 book ai didi

c# 为什么不能将开放的泛型类型作为参数传递?

转载 作者:太空狗 更新时间:2023-10-29 23:17:00 25 4
gpt4 key购买 nike

为什么open泛型不能作为参数传递。我经常上这样的课:

public class Example<T> where T: BaseClass
{
public int a {get; set;}
public List<T> mylist {get; set;}
}

假设BaseClass如下;

public BaseClass
{
public int num;
}

然后我想要一个方法说:

public int MyArbitarySumMethod(Example example)//This won't compile Example not closed
{
int sum = 0;
foreach(BaseClass i in example.myList)//myList being infered as an IEnumerable
sum += i.num;
sum = sum * example.a;
return sum;
}

然后我必须编写一个接口(interface)来将这个类作为参数传递,如下所示:

public interface IExample
{
public int a {get; set;}
public IEnumerable<BaseClass> myIEnum {get;}
}

然后必须将泛型类修改为:

public class Example<T>: IExample where T: BaseClass
{
public int a {get; set;}
public List<T> mylist {get; set;}
public IEnumerable<BaseClass> myIEnum {get {return myList;} }
}

对于我认为编译器可以推断的内容,这是很多仪式。即使无法更改某些内容,如果我知道缺少语法快捷方式的原因/理由,我也会发现它在心理上非常有帮助。

最佳答案

我也遇到过类似的情况,但我从来没有遇到过这个(很好!)问题。现在我不得不考虑一下,这是我的答案:

您希望以下内容起作用:

void F(Example<> e) {
Console.WriteLine(e.a); //could work
}

是的,这在理论上可行,但这行不通:

void F(Example<> e) {
Console.WriteLine(e.mylist); //?? type unknown
}

您希望编译器和 CLR 能够分析方法体并证明在第一种情况下确实没有不安全的访问。 可以发挥作用。为什么不是呢?可能,设计不是真的合理和困惑。此外,“默认情况下所有功能都未实现。必须有人实现、测试和记录它们。”

编辑:我想指出,如果没有 CLR 的合作,这个功能是无法实现的。 C# 编译器必须发出要调用的确切方法,这在开放泛型类型上是不可能的。类型系统现在甚至不允许这样的变量。

关于c# 为什么不能将开放的泛型类型作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796177/

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