It would be non-standard but C Lua outputs any userdata as a 'useless' string only because it can't make a pointer "print itself":
print(userdata)
output: "userdata 34953678"
In C# however we have ToString() so I would expect that to get called:
print(userdata)
output: "LuaVector3(1,2,3)"
-- and for null values
print(nullluserdata)
output: "userdata(null)"
And similar with type() although the standard type(x) == "userdata" must still work.
Thus I suggest adding typeof(x) to basic library, it returns GetType().FullName.