"long?" 真的是一个结构体吗?

Is "long?" really a struct?

根据定义,Nullable<> 是一个结构,但当我调用一些通用函数时,它的行为就像一个对象。

class GenController
{
    public void Get<T>(T id) where T : struct
    {
        Console.Write("is struct");
    }

    public void Get(object obj)
    {
        Console.Write("is object");
    }
}

long param1 = 1234;
new GenController().Get(param1);
// output is "is struct" as expected

long? param2 = 1234;
new GenController().Get(param2);
// output is "is object"
// obj seen at debug time as "object {long}"
// expected "is struct"

因此参数被视为对象而不是结构。

知道发生了什么,我是不是误解了 struct 的意思?

有没有办法将 Nullable<T>Tobject 作为不同类型的参数发送?

Nullable<T>definitely a struct

您的问题更多是关于 where T : struct 泛型类型约束,而不是关于 Nullable<T>.

来自the docs

where T : struct: The type argument must be a non-nullable value type.

long?nullable 值类型,因此 where T : struct 约束不允许。

回答问题:

  • Nullable<T> 是一个 struct
  • struct 约束只允许不可空的结构。

话虽如此,您可以指定参数可为空,如下所示:

public void Get<T>(T? id)
    where T: struct
{
    Console.Write("is nullable struct");
}

这将是捕获可为 null 的结构的另一种重载。