如何根据给定的泛型类型安全地转换和返回 m_obj。
private IObject m_obj;
public bool TryGetAs<T>(out T value) where T :IObject
{
value = m_obj as T; // The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint
// value = (T)m_obj; This compiles!
if (value != null)
return true;
return false;
}
我知道如果 m_obj 我有一个列表,我可以简单地这样做:
private readonly IList<Object> m_objects;
internal IList<T> Collect<T>() where T : IObject
{
return m_objects.OfType<T>().ToList();
}
但是我找不到以前代码的解决方案。
public interface IObject
{
}
我的答案:
public bool TryGetAs<T>(out T value) where T :IObject
{
value = default(T);
if (!(m_obj is T))
return false;
value = (T)m_obj;
return true;
}
的as
操作者被保留用于引用类型。如果T
始终是引用类型,则解决方案是class
向TryGetAs<T>
. 如果T
也可以是值类型,这不是一个选项。在这种情况下,您可以使用is
运算符:
public bool TryGetAs<T>(out T value) where T : IObject
{
if(m_obj is T)
{
value = (T)m_obj;
return true;
}
else
{
value = default(T);
return false;
}
}
在 C# 7.0 中,您可以像这样简化它(并提高性能,因为您不需要is
强制转换然后再进行其他类型转换):
public bool TryGetAs<T>(out T value) where T : IObject
{
if(m_obj is T tValue)
{
value = tValue;
return true;
}
else
{
value = default(T);
return false;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句