gpt4 book ai didi

c# - 具有意外行为的通用方法参数

转载 作者:行者123 更新时间:2023-11-30 16:41:19 26 4
gpt4 key购买 nike

我目前在使用通用方法时遇到问题。首先,我有一个抽象类,其中包含这个抽象的通用方法:

abstract protected void myMethod<T> (List<T> myList);

然后,在实现该方法时,我使用 DateTime 作为列表的类型:

protected override void myMethod<DateTime>(List<DateTime> myList)

到目前为止,一切似乎都还不错。然后,我发现意外的行为是我无法访问列表项的任何 DateTime 方法:

String date = ((DateTime)myList[0]).ToString("dd-MM-yyyy");

方法“ToString”没有重载需要 1 个参数

所以这就是问题所在,无论我尝试什么转换,我都无法修复错误。我应该提一下,我刚刚开始使用 C#,所以我可能还不了解泛型类型应该如何工作。

L.E.所以我真正想做的是从 C# 创建和完成一些 word 文档。我的父抽象类将有 2 个方法,createDocument 和 completeDocument。 createDocument 不依赖于文档,因为创建过程总是相同的。所以,我在父类中实现了它。然后,completeDocument 方法将取决于我要完成的文档,因为我将使用不同类型的信息,这些信息将添加到文档的不同区域。上面的 myMethod 是我试图用 completeDocument 实现的简化版本。

所以,现在我有 2 种不同的文档类型,这意味着基类被继承了两次。一个文档需要 DateTime 信息,另一个文档需要一些不同的类型。

最佳答案

方法的泛型参数应该在调用方法时提供,而不是在方法被重写时提供。

必须给类添加泛型参数,然后在子类中指定具体类型

public abstract class A<T>
{
abstract protected void myMethod(List<T> myList);
}

public class B : A<DateTime>
{
protected override void myMethod(List<DateTime> myList)
{
var date = myList[0].ToString("dd-MM-yyyy");

}
}

注意

如果您可以在覆盖方法时指定特定类型

public abstract class A
{
abstract protected void myMethod<T>(List<T> myList);
}

public class B : A
{
protected override void myMethod<DateTime>(List<DateTime> myList)
{
}

}

然后是下面的代码

 A a = new B();
a.myMethod(new List<string>());

会不一致,你传递的是List<strign>方法,实际上它期望 List<DateTime> .

事实上

protected override void myMethod<DateTime>(List<DateTime> myList)

只是指定新名称TDateTime .

关于c# - 具有意外行为的通用方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49552150/

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