0

IMarkupExtension 内の指定されたパラメーターが期待する型と互換性がない場合、コンパイル時に例外をスローしたいと考えています。この効果を達成できますか?

以下に実験を載せますが、「TODO」に書いた内容をどこでどのように確認すればよいのかわかりません

コード (私は todo をマークしました)

using System;
using Xamarin.Forms.Xaml;

namespace MySample
{
    public class SampleClass : IMarkupExtension
    {
        public IParameter Parameter { get; set; }
        public object ProvideValue(IServiceProvider serviceProvider)
        {
            return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
        }
    }

    public interface IParameter
    {
        string GetData();
    }
    public class SampleData1 : IParameter
    {
        public string GetData()
        {
            return "Data1";
        }
    }
    public class SampleData2 : IParameter
    {
        public string GetData()
        {
            return "Data2";
        }
    }
}

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:mysample="clr-namespace:MySample"
             x:Class="MySample.SamplePage">
    <ContentPage.Resources>
        <mysample:SampleData2 x:Key="SampleData2" />
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout>
            <Label>
                <Label.Text>
                    <mysample:SampleClass Parameter="{StaticResource SampleData2}" />
                </Label.Text>
            </Label>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

パラメータはSampleData2型ですが、SampleData1型でない場合は例外をスローしたいことに注意してください

リソース

<mysample:SampleData2 x:Key="SampleData2" />

リソース使用量

Parameter="{StaticResource SampleData2}"

チェック(必ずしもこの場所ではありませんが、コンパイル中に確実に)

public object ProvideValue(IServiceProvider serviceProvider)
{
    return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
}
4

1 に答える 1

1

コンパイル時に例外をスローすることはできないと思います。論理エラーはコンパイラでは検出できないため、プログラムの実行時にのみ検出されます。

コンパイル時エラー:

プログラミング言語の適切な構文とセマンティクスに従わない場合、コンパイラはコンパイル時エラーをスローします。

例えば:

1.セミコロンがありません

2.キーワードを大文字で書く

3.変化することはありません

ランタイムエラー:

プログラムが実行状態の場合、実行時エラーが生成されます。それらはしばしば例外と呼ばれます。

例えば:

1.ゼロ除算

2.メモリ不足

3.ヌルポインタの逆参照など

以下のコードを使用してthrow a Exception、この関数がトリガーされ、タイプParameter ではない場合に使用できます。SampleData1

 public object ProvideValue()
        {

            if (Parameter is SampleData1)
            {

                return Parameter.GetData();//TODO: throw Exception("Parameter must be of type SampleData1")
            }
            else if (Parameter is SampleData2)
            {   

                throw new Exception("Parameter must be of type SampleData1");                
            }
            return "error";
        }
于 2018-11-19T07:47:58.460 に答える