【问题标题】:Is partial type inference possible? [duplicate]部分类型推断可能吗? [复制]
【发布时间】:2020-06-10 15:00:02
【问题描述】:

给定以下代码:

    public static TUnbox UnboxAndNullCheck<TUnbox, TBox>(TBox obj, string msg = "Unboxing error") where TUnbox : class, TBox
    {
        var unboxObj = obj as TUnbox;
        if (unboxObj == null)
            throw new ArgumentNullException( msg );
        return unboxObj;
    }

似乎调用它需要两个类型参数:

UnboxAndNullCheck<SubClass, BaseClass>( obj );  

可以不用指定obj类型的方式调用吗?

UnboxAndNullCheck<SubClass>( obj );  

【问题讨论】:

  • 我不认为这可能就像我们不能拥有Dictionary&lt;int&gt;
  • 这给你的调用代码带来了什么,而仅仅使用as 却没有?
  • 另外,它使用 ArgumentNullException 不正确; ANE 适用于当参数为 null 时,而不适用于代码中的某些内容为 null 时(这就是 NullReferenceException 的用途),从而导致 null。这会让其他开发人员感到困惑——“为什么我确实提供了有价值的东西,但我却得到了 Arg Null?”
  • 我举了一个例子来说明我问的问题。

标签: c#


【解决方案1】:

修正类型?

public static TUnbox UnboxAndNullCheck<TUnbox> (object obj, string msg = "Unboxing error") where TUnbox : class

但是我真的不确定这会给您带来什么,仅使用 isas.. 除了在运行时令人困惑地抛出一个错误,说传递的参数显然没有值,并且我真的不确定它会给你带来什么,而不是仅仅做一个演员。如果 TBox 可以转换为 TUnbox,它就可以工作。如果没有,它会抛出异常

//this
var x = UnboxAndNullCheck<TUnbox>(myTBox);

//is just the same as this, except this is more compact  and throws the right exception
var x = (TUnbox)myTBox;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多