当前位置: 首页 > 知识库问答 >
问题:

C#与铸造泛型参数

鲜于星波
2023-03-14

我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料:

public interface INonGen
{
    void Get<T>(ref T value);
}

public interface IGen<U> : INonGen
{

}

public class Gen<U> : IGen<U>
{
    private U u;
    public void Get<T>(ref T value)
    {
        if (value is U)
        {
            value = (T) u;
        }         
        else
            throw new Exception();
    }
}

这不编译

有什么办法可以让我做这个演员吗?

我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。

其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。

我们应该保持类型安全,所以我需要返回一个正确类型的实例/值。对象上的任何快捷方式都是不可接受的,在非泛型接口中约束类型也是不可接受的。

通用实现是为了避免重复。我希望支持多个不同的类型(但只支持一小组类型),但我希望这一点在我实例化一个类时决定(并定义T的含义);我仍然希望非泛型接口允许使用任何t;也就是说,我不希望在接口中显式地显示类型集。

共有1个答案

齐乐逸
2023-03-14

当您将一个对象强制转换为另一个对象时,如果编译器找不到转换,它将报告一个错误。由于这两个类型参数是不受约束的,唯一的选择是使用as运算符,该运算符在强制转换失败时返回null而不是抛出invalidcastexception。要使用作为,还需要将泛型类型约束为类。

public class Gen<U> : IGen<U>
{
    private U u;
    public void Get<T>(ref T value)
            where T : class
    {
        if (value is U)
        {
            value = u as T;
        }         
        else
            throw new Exception();
    }
}

如果不想添加约束,可以强制转换为object:

value = (T)(object)u;

但是您的代码中有一个逻辑错误。如果值是u,什么保证u是t?例如:

 var gen = new Gen<Base>();
 gen.Set(new DerivedA()); // sets u;
 var b = new DerivedB();
 gen.Get(ref b);

在本例中,value是base,而不是u是derivedb。转换将在运行时失败。

更新

在阅读了你的一些评论之后,下面是我应该如何设计的:

public interface INonGen
{
    object Value { get; }
}

public interface IGen<U> : INonGen
{
}

public class Gen<U> : IGen<U>
{
    private U u;
    public object Value
    {
       get { return u; }
    }
}

从字典中提取项目时:

double value = (double)dictionary[key].Value;

如果没有运行时转换,将引发invalidcastexception。很简单,不是吗?

 类似资料:
  • 在抽象工厂模式中,我使用泛型。我有一个扩展Serializable的BaseEntity接口,Employee类实现了BaseEntity。在抽象类中,我有一个getJavaObj方法 是一种方法,它接受并返回

  • 本文向大家介绍C# 泛型参数转换,包括了C# 泛型参数转换的使用技巧和注意事项,需要的朋友参考一下 泛型不同参数类型生成的对象是相互独立的。 很多时候,我们希望实现 to = ts 这种操作,为什么?因为看上去它应该如此。 为了达到这个目的,就要解决“泛型参数转换的问题”,这个问题的知识点是in out 泛型变体。老实说,这个问题本身不困难,只是非常不直观,很容易让人忘记。 首先一点,为了实现to

  • 我目前在辅导一个高中生AP Java,她问了我一个关于“双选”的问题。我以前从未听说过这个术语,但显然她的老师希望她在即将到来的期末考试中知道这个术语。 她的老师提供的例子是,如果你想将一个整数转换成一个字符串,你必须执行以下操作才能避免编译器错误: 问题是:你想在现实生活中什么时候这样做? 老师只提供了导致运行时错误的示例。此外,我从来不知道有一个术语,但这样做似乎是个坏主意,因为只有当两种类型

  • 我对Java中的原语类型有一个问题。我使用的是JDK1.6。 如果我有以下信息: 编译器不想编译——它说它“无法从int转换为short”,并建议我转换为,因此: 真的管用。但我的问题是,我为什么要投?a和b的值在-短值范围为{-32768,32767}的范围内。当我想执行操作时,我还需要强制转换-,*,/(我还没有检查其他操作)。 如果我对基元类型执行相同的操作,我不需要将aa bb强制转换为。

  • 本页包含内容: 泛型形参子句 泛型实参子句 本节涉及泛型类型、泛型函数以及泛型构造器的参数,包括形参和实参。声明泛型类型、函数或构造器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型构造器时,就用具体的类型实参替代之。 关于 Swift 语言的泛型概述,见泛型(第二部分第22章)。 泛型形参子句 泛型形参子句指定泛型类型或函数的类型形参,以及这些参数的关联约