C# ToString重载中未处理的异常

C# ToString重载中未处理的异常,c#,visual-studio-2015,xamarin.android,C#,Visual Studio 2015,Xamarin.android,你好,谢谢你抽出时间 我最近决定尝试使用Xamarin.Android来开发我的想法 然而,我遇到了我遇到过的最奇怪的问题 public class Note : INote { public string Content { get; set; } public DateTime DateTime { get; set; } public List<ITag> Tags { get; set; } public override string To

你好,谢谢你抽出时间

我最近决定尝试使用Xamarin.Android来开发我的想法

然而,我遇到了我遇到过的最奇怪的问题

public class Note : INote
{
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<ITag> Tags { get; set; }

    public override string ToString()
    {
        try
        {
            const int maxLength = 20;
            if (Content.Length > maxLength)
            {
                return Content.Substring(0, maxLength - 1);
            }
            return Content;

        }
        catch (Exception)
        {
            return Content;
        }
    }
}
公共类注释:INote
{
公共字符串内容{get;set;}
公共日期时间日期时间{get;set;}
公共列表标记{get;set;}
公共重写字符串ToString()
{
尝试
{
const int maxLength=20;
如果(Content.Length>maxLength)
{
返回Content.Substring(0,maxLength-1);
}
返回内容;
}
捕获(例外)
{
返回内容;
}
}
}
在上面的类中,当我对少于20个字符的note对象执行ToString操作时,会得到一个未处理的异常。我觉得这很奇怪,所以我用一个try/catch来包装这个部分

但是,我仍然得到一个未处理的异常。这怎么可能

编辑: 异常窗口也会显示werid。通常它们看起来像这样。

在填充ListView时调用ToString,这在这段代码中完成

[Activity(Label = "@string/ApplicationName")]
public class ShowNotesActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.ShowNotes);
        var persistence = new Persistence();
        var listView = FindViewById<ListView>(Resource.Id.listView1);

        var adapter = new ArrayAdapter<INote>(this, Android.Resource.Layout.SimpleListItem1, persistence.GetAllNotes());

        listView.Adapter = adapter;

    }
}
[活动(标签=“@string/ApplicationName”)]
公共类ShowNotesActivity:活动
{
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ShowNotes);
var persistence=newpersistence();
var listView=findviewbyd(Resource.Id.listView1);
var adapter=new ArrayAdapter(这个,Android.Resource.Layout.SimpleListItem1,persistence.GetAllNotes());
Adapter=适配器;
}
}

以下是我在Visual Studio中测试并确认有效的代码:

public class Card
{
    public string Content { get; set; }

    public override string ToString()
    {
        if (Content == null)
            return null;

        const int maxLength = 20;
        if (Content.Length > maxLength)
            return Content.Substring(0, maxLength - 1);

        return Content;
    }
}
下面是我用来测试它的内容(实用方法是我自己从代码沙箱中得到的方法之一):

(请注意,它实际上并没有打印“空结果”。我只需要在那里键入一些内容,否则就不会让我用一行空格开始代码块。)


由于上面的代码工作得很好,我可以说,无论您的问题是什么,它与代码没有任何关系。(或者,至少是这个代码。)

当你得到异常时,输入是什么?你是说当
内容
少于20个字符时,它也进入
if
条件的内部?如果是,您是否可以在
if
条件下设置断点,并检查当时
Content.Length
的准确值。如果Content.Length小于20,我将得到异常。它可能是任何东西。上一次尝试修复时,我创建了两个注释。其中一个的内容是:“asdfghjklqwertyuiopz”,没有引起任何异常。还有一个内容为“e”的异常,它确实导致了异常。您是否在
ToString()
中设置了一个断点,并在您预期的位置观察了异常的发生?因为似乎没有堆栈跟踪…@MortenToudahl你说你在ToString上放了一个断点,你试过把它放在ToString上吗?请记住,每次在调试器中显示对象时都会调用ToString。感谢您为我指明了正确的方向。我不知道到底发生了什么。但这似乎是项目中的一个问题。我删除了这个项目,并复制了我写的所有代码。现在它可以正常工作了。
var card = new Card();
var str = Utility.GetRandomAlphaNumString(40);

for (int i = 0; i < 40; i++)
{
    card.Content = str.Substring(0, i);
    Console.WriteLine(card.ToString());
}
// [Empty result]
W
W1
W1U
W1UJ
W1UJ2
W1UJ2X
W1UJ2X4
W1UJ2X48
W1UJ2X48B
W1UJ2X48BU
W1UJ2X48BU9
W1UJ2X48BU9A
W1UJ2X48BU9A4
W1UJ2X48BU9A46
W1UJ2X48BU9A46C
W1UJ2X48BU9A46CY
W1UJ2X48BU9A46CYV
W1UJ2X48BU9A46CYVA
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8R
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8
W1UJ2X48BU9A46CYVA8