已回答  如何返回可为空的类型对象?

已加入
2020年10月9日
留言内容
7
编程经验
1-3
C#7.3。我正在尝试一种方法 类型 参数并返回其对应的nullable。喜欢:

C#:
public static System.Type GetTypeNullable(System.Type t)
{
    return System.Nullable<t>;
}

这显示了错误:“ t?”是一种类型,在给定的上下文中无效。
That's precisely my intention: to return the t?.

也试过了
C#:
return typeof(System.Nullable<t>);
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
注意编译器给出的其他错误。
错误CS0118't'是变量,但像类型一样使用

无论如何,这对我有用:
C#:
public static Type GetNullableType<T>() where T : struct
    => typeof(T?);
 
已加入
2020年10月9日
留言内容
7
编程经验
1-3
谢谢,这真是太简单了,但我却没有想到。我很着迷于为我的根本问题找到解决方案,昨天整天我已经尝试了多种方法,这就是我要提出的问题。我一直在寻找一种方法来退还 目的 of type T?. And the root of this is searching for a way to return null regardless of T being a value or reference type. Like so:

C#:
public T GetSourceNode<T>(T sample)
{
    if(Validate(sample))
        return sample;
    else
        return null;
}
T could be anything, value type, reference type. One way is to use 目的 as return type but consumer would have to cast it and this is not good.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
谢谢,这真是太简单了,但我却没有想到。我很着迷于为我的根本问题找到解决方案,昨天整天我已经尝试了多种方法,这就是我要提出的问题。我一直在寻找一种方法来退还 目的 of type T?. And the root of this is searching for a way to return null regardless of T being a value or reference type. Like so:

C#:
public T GetSourceNode<T>(T sample)
{
    if(Validate(sample))
        return sample;
    else
        return null;
}
T could be anything, value type, reference type. One way is to use 目的 as return type but consumer would have to cast it and this is not good.
I don't see how you could do that without declaring two separate methods because in one case you input T和output T while in the other case you input T和output T?. In the case of value types, the output is not the same as the input so you can't use the same method as for reference types.
 
已加入
2020年10月9日
留言内容
7
编程经验
1-3
那个东西...那个返回类型不被认为是签名的一部分...否则我会使用基本的 静态的 polymorphism. Same with type constraints, if they would make the compiler aware, I'd have the same name for where T : structwhere T : class.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
那个东西...那个返回类型不被认为是签名的一部分...否则我会使用基本的 静态的 polymorphism. Same with type constraints, if they would make the compiler aware, I'd have the same name for where T : structwhere T : class.
是的,我并不是在暗示您应该重载方法,因为参数不会有所不同。您需要两种单独的方法,而您只需要根据是值类型还是引用类型来调用正确的方法即可。您显示的一般约束将防止您调用错误的约束。
 
已加入
2020年10月9日
留言内容
7
编程经验
1-3
使用不同的名称最终必须合并到类内部的一个名称调用中。我仅出于多态性的原因就需要一个名字。

感谢你们俩花时间为您提供帮助。那意义重大。
I'll rethink the model. Instead of T T? I'll probably return a tuple that contains the T 目的 and a bool like 'isNull'.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
In that case, could you perhaps write a method similar to all the TryParse methods, e.g.
C#:
public bool TryValidate<T>(ref T sample)
{
    if (Validate(sample))
        return true;

    sample = default;

    return false;
}
That's a ref parameter so you would lose the original value. If that's not a problem then this may be the way to go. There would probably be a better name for that method but you'd know that better than me.
 
已加入
2020年10月9日
留言内容
7
编程经验
1-3
谢谢 @jmcilhinney 但我想退还该对象。
Speaking of default, the ability to return null for both value and reference types would work well alongside default. Imagine returning an "undefined" value from methods, for value types, just as null is for references. Just return (possibly a type agnostic) 不明确的. default would have been perfect. If only... I don't want to sound nitpicky but default represents for each value type, a very common, maybe the most common value, which is confusing, at least for me. Ideally all variables, value and reference, would be nullable but given the language, at least pick the most infrequent value (1) that wouldn't mess up the contiguity of values (2), so I'd say MaxValue. MinValue coincides with 0 for many types so it's a no-go.
I wish defaults could be custom defined per project but if I'm not mistaken default is currently about filling 0's in object's memory.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
I wish defaults could be custom defined per project but if I'm not mistaken default is currently about filling 0's in object's memory.
default is like Nothing in VB. It basically gives you the same value as an uninitialised variable of the type, i.e. the default value for that type. It's about filling zeroes in a variable's memory, not an object's memory. That's why default produces null for reference types: there is no object. Value type variables contain the object itself rather than a reference to an object, so that object is full of zeroes and it's up to the type how that is interpreted.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我仅出于多态性的原因就需要一个名字。
你有吗您必须知道设计时的类型才能调用泛型方法,因此,除非您要传递要在类和结构中实现的接口类型的变量,否则您必须知道无论是值类型还是引用类型。引用类型的任何派生类型仍然是引用类型,因此没有问题。我怀疑您可能正在想象一个不存在的问题。
 
已加入
2020年10月9日
留言内容
7
编程经验
1-3
当然,总有办法解决与"need"意思是介于"我需要食物才能生存" and "我需要你相信我"  :) 但是,当我必须解决问题时,即使我知道立即解决方案,我也会尝试进行一些研究,即使这需要花费额外的时间。这样,我将找到一种更好的方法,也适用于其他用例。
Ok, sample, the parameter, can be anything. I suppose I could get it done with separate names based on nullable/non-nullable. But I just want to do it in a less blunt way. i.e. I want polymorphism. The class is meant to be consumed by other, external users. And apart from the case above I also need the <same name> implementation for an indexer of the T 类型 in the class. In which case I don't even have a name. And thank you for pointing out the struct/class/interface use case. And finally, for completion, a whole range of cases that thank God, I don't have to implement. (Yet). Extension methods + generics. Consider:

C#:
public T GetMedian(this List<T> ts)
{
    return ts[t.Count/2];
}
什么 if the return is null? I could have GetMedianNullableGetMedianNonNullable, not cool.
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,610
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果它是引用类型的列表,则只能为null。值类型列表永远不会为空。

那么,如果它为null呢?那就是存储在列表中的值。为什么对于可能返回null或可能不会返回null的东西,必须有一个单独的方法呢?

我认为,如果您使用最新的C#功能来确保没有对象可以为空,除非您明确声明它可以为空,否则很多关于空对象的担心都会消失。
 
最佳 底部