"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>
或 T
和 object
作为不同类型的参数发送?
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 的结构的另一种重载。
根据定义,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>
或 T
和 object
作为不同类型的参数发送?
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 的结构的另一种重载。