即使运算符重载也无法强制转换为字符串

MyType<string>类型的属性使用MVC3和StringLength验证属性MyType<string>谁的内部值是一个string ,我得到一个异常:

无法投射“MyType”类型的对象来键入“System.String”。

所以我添加了一个运算符重载,这是我的类:

public class MyType<T>
{
    public T Value { get; set; }
    //...

    public static implicit operator string(MyType<T> instance)
    {
        //Return the internal value of the instance.
        return Convert.ToString(instance.Value);
    }
}

所以这在理论上应该允许将MyType转换为String 。 但是,我仍然得到相同的错误,这里是堆栈跟踪:

[InvalidCastException:无法投射'MyType'类型的对象来键入'System.String'。]
System.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(Object value)+64
System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object value,ValidationContext validationContext)+176
System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(Object value,ValidationContext validationContext)+41
System.Web.Mvc.d__1.MoveNext()+267

StringLengthAttribute.IsValid方法(来自.NET框架,而不是我的代码)正在这样做:

public override bool IsValid(object value)
{
    this.EnsureLegalLengths();
    int num = (value == null) ? 0 : ((string)value).Length;
    return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}

似乎它应该工作,我错过了什么?


变量value声明为object类型。 由于基础对象不是string ,因此必须先将其转换为实际类型。 没有从object定义到其他类型的转换,所以您正在执行的转换有效地告诉编译器,如果不是,则该对象实际上是一个string 。 这实际上是拆箱值类型时必须遵循的相同规则。

通过首先将其转换为您的类型,编译器可以意识到从您的类型到所需的string类型存在(隐式)转换,并且可以生成相应的指令。

例如,

object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj;           // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
                                  //      an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;

public override bool IsValid(object value)
{
    this.EnsureLegalLengths();
    int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;
    return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}

不要将它转换为string ,而是转换为MyType<string>

改变的代码行反映了这一点:

    int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;

编辑 :不要将MyType<string>传递给该方法,将MyType<string>.Value传递给它,以便投射成功。


您正在使用隐式转换,并且您应该执行显式转换,因为框架会明确地转换它。 喜欢这个:

(string)value

你应该添加:

public static explicit operator string(MyType<T> instance)
{
    //Return the internal value of the instance.
    return Convert.ToString(instance.Value);
}
链接地址: http://www.djcxy.com/p/71061.html

上一篇: Can't Cast to String Even With Operator Overloaded

下一篇: memcache as Nhibernate second level cache