我正在寻找一种方法来一致地处理所有.Net数据类型,所以我可以在下面创建任何类型实现IGetValue<out T>将转换为的模式IGetValue<object>.出于某种原因,如果T是a struct,它不起作用,我不明白为什么.有没有办法可以实现以下模式?
public interface IGetValue<out T>
{
T Value
{
get;
}
}
public class GetValue<T> : IGetValue<T>
{
public GetValue(T value)
{
_value = value;
}
private T _value;
public T Value
{
get { return _value; }
}
}
class Program
{
static void Main(string[] args)
{
IGetValue<string> GetString = new GetValue<string>("Hello");
IGetValue<int> GetInt = new GetValue<int>(21);
//This works!!!
if (GetString is IGetValue<object>)
{
Console.WriteLine("GetValue<string> is an IGetValue<object>");
}
else
{
Console.WriteLine("GetValue<string> is not an IGetValue<object>");
}
//This doesn't work!!! Why????
if (GetInt is IGetValue<object>)
{
Console.WriteLine("GetValue<int> is an IGetValue<object>");
}
else
{
Console.WriteLine("GetValue<int> is not an IGetValue<object>");
}
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我意识到我在这里想要完成的事情看起来很模糊,但这是一个更大设计的一部分,其解释过于冗长.我需要的是让我所有的IGetValue<T>s与一个名为"Value"的属性共享一个公共类型或接口,返回一个object.为什么是冗长的部分.
它不起作用,因为泛型方差不适用于值类型......它们具有不同的表示形式,而参考类型的方差可以在CLR不必执行任何转换的情况下发生.
因此,例如,您可以将a IEnumerable<string>视为一个IEnumerable<object>,但不能将其IEnumerable<int>视为一个IEnumerable<object>.
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |