C# 泛型和类型

4

我有一个类似下面的通用方法:

public abstract T method<T>(int arg) where T : class, new();

然后我在子类中实现它

public MyType method<MyType>(int arg){
    MyType e = new MyType();

    e.doStuff (arg); // ERROR HERE

    return s;
}

但是我无法访问MyType的成员...为什么?有什么方法可以使它们可用或者其他的东西吗?
谢谢
Miloud

1
要访问类型的成员,您必须在基类、接口上设置约束或使用反射。 - moi_meme
@Miloud - 当你编写问题时,<code>标签无法正常工作 - 我已经为您编辑了它以解决问题。您只需要使用4个空格缩进代码,或者将其突出显示并按下代码(0101)按钮即可。 - Graham Clark
你确定那里不缺少一个 override 关键字吗? - Marc Gravell
moi_meme 谢谢,我明白了你的意思。Clark 感谢你的格式化 ;),而 Marc Gravel 我确实缺少一个覆盖(复制/粘贴错误)呵呵。 - CoolStraw
应该返回 e,拼写错误。 - CoolStraw
2个回答

3

C#没有模板特化。你只是声明了一个名为MyType的类型参数的新方法,它与名为MyType的类毫无关系。

你可以进行强制类型转换,或者使用通用约束来声明T至少是MyType

另一种选择是使基础类型本身对T进行泛型化(并从方法中删除泛型),并让具体类型: TheBaseType<MyType>


等一下,我对 cast 选项很感兴趣,但如果我转换为 MyType,它仍然是成员自由的。你如何自己转换? - CoolStraw
@Miloud - 如果不了解情况,我无法进行更多澄清;s是什么?MyType是什么?TMyType之间的关系是什么?例如,类型约束可能是实现此操作的方法,但我不确定具体的实现应该创建T还是MyType等。 - Marc Gravell
1
如果您在方法MyType中保留了通用类型的名称,并将其强制转换为MyType,则您正在将其强制转换为通用类型,而不是实际的MyType类型。将方法的通用参数重命名为其他名称(例如T),然后将T的实例强制转换为MyType - Greg D
我明白你的意思,Marc。实际上,我想要实现的是不可能的。我已经为Type和Generic使用了不同的名称,但这并没有改变任何东西。正如你所说,即使我将其转换为MyType,它仍然是一个泛型类型,因此无法访问其属性。我想我要重新开始编写代码,并以不同的方式思考。感谢你的帮助 :) - CoolStraw
@Miloud - 看看Greg上面的观点;通用参数应该真正是T;然后就有了TMyType之间的区别。 - Marc Gravell

3
你可以这样做(请注意,我已经调整了一些通用参数和约束条件)。
public class MyType
{
    public void doStuff(int i){}
}
public abstract class ABase<T>where T : class, new()
{
    public abstract T method(int arg);
}

public class AChild : ABase<MyType>
{
    override public MyType method(int arg)
    {
        MyType e = new MyType();

        e.doStuff(arg); // no more error here

        return e;
    }
}

这可以是一种非常有效的技术。我在这里也演示了它:https://dev59.com/hHE95IYBdhLWcg3wlu4g#2246610 - Greg D
谢谢Albin,我之前也考虑过这种方式,但实际上它会让我的代码变成一个丑陋的老太婆的脸,呵呵。 - CoolStraw
@Miloud B,你的另一个选择是创建一个带有doStuff方法的接口,并将其添加到方法约束where T:IMyInterface,new();中。 - Albin Sunnanbo
Albin,你上面的代码就是我所需要的,一开始我只是读错了,非常感谢你! - CoolStraw
@Albin 你确定它叫做override public而不是public override吗? - Pascal
@Pascal,根据http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf(第286页),两者都是有效的,但你是正确的,因为“public override”是最广泛使用的。 - Albin Sunnanbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接