►
From YouTube: GitHub Quick Reviews
Description
00:00:00 - Approved: Guarding calls to platform-specific APIs https://github.com/dotnet/runtime/issues/33331#issuecomment-650326500
01:21:00 - Approved: OS compatibility analyzer https://github.com/dotnet/runtime/issues/37359
A
A
A
All
right
good
morning,
good
evening
or
wherever
you
are
so
we
are
reviewing
today
platform
certificate
apis
and
how
we
model
them.
I
might
be
slightly
biased
in
this
review
because
I
proposed
the
api
shape,
so
I
will
try
not
to
impose
myself
too
much
because
it
also
will
take
me
taking
notes
which
looking
bad
was
probably
not
a
good
idea,
but
also
helps
me
to
focus.
A
A
So
basically
there's
a
few
things
you
want
to
get
out
of
this,
so
it
starts
with
the
fact
that,
starting
with
dot
net
five,
we
have
new
tfms
that
allow
you
to
target
particular
operating
systems
right.
So
the
ones
we
envision
are
windows,
ios
android
mostly
for
now,
and
so
the
idea
is
in
the
project
file.
A
So
there's
the
string
that
core
app
comma
version
equals
5.0
as
we
burn
it
in
today,
and
we
would
extend
that
to
also
generate
target
platform
and
minimum
platform
attributes
which
are
both
new.
The
attributes
don't
exist,
so
we
will
review
those
and
that's
the
string
that
we
envisioned
to
record
because
it
basically
mirrors
the
string
that's
in
the
project
file.
A
Then
we
basically
also
have
the
idea
that
well
now
that
you
see
the
ios
11
and
ios
12
apis.
How
do
you
avoid
a
situation
where
you
accidentally
call
new
apis
without
intending
that?
You
know
everything
compiles
fine
and
you
run
your
app
on
ios
10
for
the
first
time
and
then
everything
blows
up.
A
A
Runtime
information,
dot
is
os
platform
and
we
would
basically
add
a
new
api
is
os
platform
or
later
where,
basically,
you
can
pass
in
the
platform
and
the
version
number,
and
we
basically
tell
you
whether
you're
running
on
this
platform
or
not,
and
we
would
do
the
version
comparison
for
you,
because
we
know
historically
that
people
are
really
bad
at
formulating
version.
Queries
apparently,
and
so
the
idea
here
is
that
we
also
have
an
analyzer
that
will
honor
this.
A
So
the
idea
is,
if
you
write
the
code
naively
meaning
you
just
call
the
ios,
11
or
12
api
directly,
then
basically,
you
will
get
a
warning
and
then,
when
you
actually
write
the
platform
guard
on
top
of
that,
then
the
idea
is
that
the
analyzer
is
smart
enough
to
not
give
you
a
warning.
So
this
way
you're
not
accidentally
calling
newer
apis,
and
you
can
also
do
the
correct
version
checks
in
your
code.
A
Then
there
is
the
you
know
slight
side
effect
of
that.
So
the
question
is,
first
of
all,
how
does
the
system
even
know
that
this
api
here
is
specific
to
ios
14,
and
the
answer
is
the
the
the
api
will
be
attributed,
and
so
the
idea
is
that
the
assemblies
that
give
you
access
to
the
os
specific
apis,
which
we
call
os
bindings,
will
have
attributes
pretty
much
in
every
single
api.
That
will
tell
you
which
version
this
api
was
introduced
in
and
our
analyzer
will
use
those
attributes
to
give
you
the
warnings.
A
However,
these
attributes
are
not
restricted
to
just
the
you
know
the
os
bindings
themselves.
You
can
also
apply
them
to
your
own
code,
and
so
we
already
saw
that
earlier
here
is
that
the
minimum
platform
version
is
already
burned
with
the
assembly
as
well,
which
basically
means
the
the
idea
is
that
your
entire
assembly
will
run
on
ios
10
and
then
the
idea
is
also
you
can
say.
Well,
maybe
there's
an
os
api
that
is
hard
to
call.
A
So
let's
say
you
want
to
write
a
wrapper
type
around
that
that
you
use
by
yourself
in
this
case,
what
you
can
do
is
you
can
just
mark
your
wrapper
type
itself
being
a
platform
specific
which
no
means
in
in
your
methods
that
you
have.
You
will
not
get
any
warnings,
because
you
already
said
this
whole
type
can
only
be
used
when
you're
running
on
ios
14
and
then
every
part
in
your
code
that
would
use
this
wrapper
type.
Will
now
also
have
to
do
these
version
checks.
A
A
Okay,
that
means
no,
then
let
me
scroll
all
the
way
back
up
and
then
say
these
are
the
apis
that
we
are
proposing.
Maybe
let's
start
with
the
with
the
attributes,
probably
should
have
reordered
that,
because,
hopefully
that's
easier
so
there's
effectively
a
few
attributes.
So
today,
target
framework
attribute
is
already
in
systemruntime.versioning.
C
Yeah,
so
I
don't.
I
don't,
have
a
question
so
much
as
a
fundamental
concern,
which
is
that
in
the
original
platform
in
the
in
the
original
os
minimum
version
and
made
a
deliberate
distinction
between
platform
and
os
because
there's
a
kind
of
overloading
of
of
the
operating
system
version
and
the
api
version
and
that
distinction.
It
does
have
some
important
consequences
and
I'm
not
really
sure
how
to
message
it
to
developers.
C
But
the
fact
that
you
can
compile
against
an
api
version
and
that
really
doesn't
have
a
that.
That
is,
that
does
not
have
a
hard
link
to
your
os
version.
C
A
That's
right
so,
like
yeah,
I
think
I
know
what
you
mean,
so
we
can
talk
about
this,
maybe
in
more
detail,
but
I
think
to
me
the
I
understand
the
concern
you
have.
I
think
in
practice,
though,
I'm
not
sure
it
makes
a
huge
difference,
because
the
idea
is
that
from
a
user
standpoint
like
these
things
are
syntactically
very
similar
right.
The
fact
that
they
are
semantically
different,
I
think,
just
kind
of
falls
out
in
the
way
you
you
use
them
right.
A
A
I
don't
think
matters
much
because
the
idea
still
is
that
what
we
put
in
this
attribute
here
is
effectively
the
version
of
the
operating
system
that
introduced
that
api
and
and
logically
you're,
just
comparing
those
for
larger
than
or
equal
to
right
and-
and
so
the
idea
is
that
I
think
syntactically
they.
They
don't
make
a
huge
difference
right,
semantically,
yes,
but
I
guess
that's
just
in
the
in
the
way
the
usage
is
being
done.
I
don't
think
it
will
cause
a
lot
of
confusion.
C
C
C
That
means
the
version
of
the
api
right.
It
doesn't
mean
that
you're
targeting
it
doesn't
mean
that
you're
baking
any
version
into
your
app
to
say
that
it
wants
to
use
the
compat
versions
for
a
specific
api
version,
not
for
the
specific
os
version
necessarily
like
it
might
give
you
some
kind
of
implicit
bound,
but
it
very
much
means
the
api
version.
C
C
So
target
platform,
min
version
has
doesn't
really
have
anything
to
do
with
target
platform
version.
Target
platform
version
is
an
api
version
target
platform.
Min
version,
as
you
have
here,
is
purely
a
runtime
thing
right.
It
doesn't
have
anything
to
do
with
the
api
at
all,
so
by
naming
them.
So.
Similarly,
it
sounds
like
it's
a
minimum
api
version
and
it's
not
a
minimum.
C
D
And
what
do
you
mean
by
an
api
version?
Because
assuming
that
I
understand
how
all
this
works,
which
could
be
wrong?
The
saying
target
framework
net
5,
ios
12-
means
if
this
is
distributed
via
nuget
like
and
if
your
something
else
is
building
for
ios
11
it'll
say
that
there's
literally
no
asset
in
this
package,
because
you
failed
to
find
something
that
intersects
in
the
red
graph.
C
C
Because
the
api
version
is
the
metadata
so
like
you
can
build
against
the
metadata
for
ios
12
and
use
exclusively
ios
11
apis
and
set
your
min
version
to
2
to
11,
and
it's
going
to
run
fine
on
11
and
you
don't
have
to
do
any
platform
checks
or
anything
like
it.
It's
the
target
the
target
platform,
the
the
target
framework,
is
purely
the
set
of
reference
assemblies.
You
have
that
you
get
to
build
against
and
those
could
be.
C
Those
could
be
rev
to
have
new
apis
that
are
in
a
new
os
version
or
they
could
be
arrived
to
have
newer,
helper,
apis
and
so
on,
but
they
they
affect
the
they
affect
the
apis
that
you
have
access
to
at
compile
time.
D
Right,
but
they
also
affect
what
at
build
time,
if
again,
assuming
nougat,
if
you've
said
your
target
framework
is
net
5,
ios
12,
then
something
building
for
a
lower
ios
version
won't
see
that
this
has
any
like.
The
output
of
this
compile
does
not
exist
on
any
ios
lower
than
12,
because
nothing's
in
the
new
package
at
that
target,
it
would
say
this
the
you're
trying
to
reference
the
thing
that
can't
be
built
in
the
in
the
target
environment.
E
It
it
it
sounds
like
the
concern
is
you
you
say.
Your
main
version
is,
for
example,
windows,
19041,
but
you're
only
using
apis
from
let's
say
15086
or
whatever
the
version
is
sure,
in
which
case
the
app
will
actually
run
successfully
on
15.086,
even
though
you
pulled
in
the
win
md
file
for
19.041,
and
so
this
sounds
like
maybe
a
potentially
separate
analyzer
that
should
exist.
That
says
you're
targeting
a
min
version,
that's
higher
than
the
highest
version
of
api
you're.
Actually
using.
Is
that
a
correct
summary
michaela.
A
So,
basically
like,
let
me
just
summarize
so
there's
the
final
sentence
that
there's
three
version
numbers.
This
is
basically
what
api
level
are
you
targeting
right?
This
is
basically
like
logically,
the
model
that
we
want
to
more
or
less
have
is
that
people
generally
compile
against
the
latest
api
version.
Then
there
is
the
what
what
version
of
the
os
do
you
want
to
be
able
to
run
on,
which
is
you
know?
Basically
it
can
be
higher
than
the
api
version,
which
is
the
normal
mode
that
we
are
all
used
to
right.
A
You
compiled
against
something,
although
you
run
against
something
later
right,
that's
easy!
Then
there
is
the
model
where
you
want
to
compile
against
something
you
know
latest,
which
is
the
latest
sdk,
let's
say,
but
you
want
to
be
running
on
an
operating
system
that
was
shipped
three
years
ago
right
and
so
what
that
means
is
you
can't
call
apis
that
were
introduced
after
that?
A
Yes,
I
tested
my
app
for
windows
10
or
I
tested
my
app
for
windows,
8
or
81,
and
that
kind
of
controls
how
the
operating
system
thinks
about
your
app
right.
If
you're
saying
my
app
was
designed
for
windows
8,
and
then
you
run
against
windows
10,
then
maybe
you
get
additional
compatibility
working
from
the
os
because
they
change
some
behavior
somewhere
versus.
If
you
were
compiled
for
10,
then
they
would
assume
that
you
tested
on
10
and
then
you
would
get
the
right
behavior,
and
so
basically
this
is.
A
This
is
what
the
target
version
really
means
in
our
world.
We
basically
like
in
dot
net
world.
We
only
have
one
today,
which
is
basically
the
target
framework
right,
and
so
what
we
we're
doing
with
the
os
part,
is
you
basically
say
yep.
You
also
be
able
to
target
the
the
operating
system
with
the
same
mechanism.
A
This
is
what
this
des
suffix
here
does,
but
but
that
basically
controls
is
kind
of
like
what
you're
compiling
for
right,
so
that
that
may
give
you
access
to
the
latest
ios
sdk,
but
you
may
still
want
to
run
on
an
older
version.
That's
what
this
min
version
thing
is
doing,
and
then
there
is
the
you
know
the
target
version,
which
is
the
correcting
behavior,
which
I
don't
think
we
have
a
representation
for
quite
yet,
but
that's
basically,
the
the
the
third
version
number.
F
C
Yeah
yeah
the
target.
The
target
version
is
a
concept
that
exists
on
android,
for
example,
it
doesn't
exist
on
ios,
so
that
one
in
particular
is
not
universal,
but
yeah
yeah,
so
the
so
the
api
version
purely
affects.
What
metadata
you
get
at
compile
time.
C
And
the
tag
and
the
minimum
os
version
purely
affects
what
one
os
is,
what
os
versions
your
pla,
your
your
application,
is
allowed
to
run
on.
D
C
C
A
A
You
know
in
the
public
surface
new
types
they
were
introduced
in
ios,
11
or
12,
which
will
now
basically
cause
the
consuming
project
to
not
even
compile
right.
So
that's
why
we
give
you
an
error.
Now
we
will
also
carry
the
min
version,
but
we
will
carry
this
effectively
as
additional
metadata
in
the
nuget
package
and
then
the
idea
is
that,
yes,
there
will
be
a
rule
in
uga
that
will
basically
compare
the
min
version
that
the
package
has
with
the
min
version
of
the
consuming
project
and,
generally
speaking,
it's
okay.
A
If
the
consuming
project
has
a
a
lower
min
version,
because
it
means
you
can
guard
your
calls
into
that
library
right
and
so
that
that's
basically
where,
where
this
other
attribute
here
comes
in,
because
that
just
falls
out,
if
you
mark
the
whole
assembly
with
this,
it
basically
just
means
that
the
consuming
project
will
get
warnings
if
its
own
minimum
version
is
lower
than
10
right.
And
then
basically,
you
just
got
your
calls.
A
D
I
was
taking
nuget
as
invariant,
which
changes
a
lot
of
my
assumptions,
so
thank
you
for
that
data.
C
So
this
this
this
this
particular
confusion
has
come
up
pretty
much
every
time
and
I
think
I
think
part
I
think
part
part
of
it
does
come
from
the
naming
of
the
target
platform
in
version
because
it
sounds
like
it
is
related
to
target
platform
version
right.
It
sounds
like
it's
a
minimum
bound
on
target
platform
version,
but
it's
not
actually
like
it.
It
has
an
implicit
it.
It
has
kind
of
an
implicit
bounding
relationship,
but
they're
not
directly
linked.
C
The
the
reason
I
had
the
reason-
the
reason
I
brought
it
up
is
so
I
do
have
a
different
name
spec
for
the
for
the
ms
build
property.
C
But
if
we
go
with
that
which
is
which
is
os
min
version,
then
would
it
make
sense
for
the
set
for
the
attributes
to
be
minimum
os
rather
than
minimum
platform,
so
that
it
aligns
so
that
people
can
see
that
these
two
things
are
directly
linked?.
A
So
I
would
generally
have
no
problem
with
that.
It's
just
that,
like
basically
in
ms
build
the
concept
right
now
is
called
platform
everywhere.
So
if
we
go
with
os
for
these
things
consistently,
then
I
have
no
problem
with
also
saying
we
that
the
attribute
uses
the
term
os
over
the
over
platform
adjusted
historically,
we
have
used
the
term
platform
to
mean
os.
C
Yeah
yeah,
I
I
get
that
the
I
think
the
overloading
is
problematic.
I
don't
know
how
to
fix
the
overloading
issue
that
the
overloading
does
cause
confusion,
that
we
have.
This
overload
between
the
compile
time
metadata
and
the
runtime
os
and
those
are
different
things
which
doesn't
matter
a
lot
of
the
time,
but
sometimes
it
really
matters
and
when
it
really
matters,
it
gets
incredibly
confusing.
But.
A
C
C
A
Yeah
so,
like
I
mean
you
can
kind
of
ignore
ms
build,
I
just
give
it
here
as
in
so
that
we
have
something
to
talk
about
really
what
matters
is
whatever
the
configuration
looks
like
here.
This
information
would
like
to
record
right,
and
so
this
is
basically
recording
the
framework
name,
which
is
basically
the
part
before
this
dash.
This
is
basically
the
part
after
the
dash,
and
then
this
is
whatever
minimum.
You
have
specified
right
right.
D
Well,
I
mean,
I
guess
I'll,
go
ahead
and
ask
the
question
now,
instead
of
circle
back
to
it
later,
but
what
I'm
building
up
to
is
in
this?
Can
we
handle
one
or
an
assembly
that
itself
like?
Let's
assume
that
there
becomes
a
an
actual
semantic
difference
in
the
re
rebranding
of
ipad
os
versus
ios?
Can
you
have
the
one.net
assembly
that
says,
assuming
their
versions
don't
align?
I
have
minimum
platform
of
ios
15
or
ipad
os
14
and
that's
embedded
in
the
same
thing.
A
So
yes,
and
no
so
basically
the
the
so
you
will
be
able
to
author
an
assembly
like
a
single
binary
that
will
have
apis
for
ios,
mac,
os
and,
let's
say
ipad
os
because
they
happen
to
be
80
overlap
and
then
there's
20
difference.
Let's
say
because
the
attributes
are
all
multiple.
You
know
you
know,
you
know
you
can
always
apply
multiple
of
them,
so
you
can
mark
the
whole
assembly.
A
As
saying
yeah,
I
have
a
minimum
os
version
for
ios
that
is
10
for
ipad
os,
it's
15
and
for
mac
os,
it's
9
or
something
right.
So
that's
possible.
The
problem
is
more
here
so
like.
If
we
actually
have
different.
You
know
different
frame
like
basically
different
names
for
ipad,
os
and
and
mac
os,
and
then
the
problem
is
you
can't
really
compile
a
single
project
for
multiple
tfms
at
the
same
time,
right
that
like,
if
you
do
multiple
tvms,
you
compile
multiple
binaries
right.
F
D
D
C
Yeah,
so
you
could
have
a
so
you
could
have
a
platform
neutral
assembly,
a
net
five
or
net
six
or
whatever,
which
has
annotations
that
say
that
certain
apis
are
going
to
only
be
available,
are
only
going
to
work
on
certain
os
versions,
and
that
might
be
because
you
use
bait
and
switch.
I
your
implementation
was
compiled
against
platform-specific
framework,
but
but
your
reference
assemblies
are
neutral.
Our
tooling,
for
that
is
not
super
great,
but
it
is
a
pattern
that
that
is
fairly
common.
C
A
A
In
in.net
today,
both
you
know.net
centered
and
net
crab.
We
have
apis
that
are
window
specific
right.
All
the
echo
apis
come
to
mind.
Registry
comes
to
mind
right,
so
I
would
assume
that
we
will
use
the
minimum
platform
attribute
on
those
so
that
when
you
use
them
and
you're
not
targeting
windows,
you
will
get
a
warning.
D
Right
so
I'm
just
I'm
just
trying
to
understand
the
what
the
the
big
scenarios
look
like
here,
because
that's
important
and
seeing
if
the
things
feel
like
they're
meeting
the
scenarios
yeah.
So
so
we
do
think
it
is
important
that
you
have
a
a
target
framework
with
a
neutral
tfm
that
does
still
participate
in
in
some
of
the
minimum
platform
stuff
here,
and
then
that
means,
if
you're
running
on
this
platform.
This
is
the
minimum.
But
if
you're
not
running
on
this
platform,
it
doesn't
apply.
C
Also
factor
I
I
don't
recall
if
you
had
this
emo,
but
there
was
definitely
a
suggestion
that
you
could
also
annotate
things
that
say
it's
not
available
on
such
and
such
a
platform.
C
A
Yeah,
like
I
assume
the
the
former
case
right
now
for
simplicity
but
yeah,
I'm
I'm
not
opposed
to
that.
That's
fair,
that's
defined,
because
I
would.
I
would
assume
that,
if
you're
platform
specific
you
either
are
in
in
very
narrow
cases
or
the
whole
thing
more
or
less
is
platform
specific
right,
it's,
it
seems
fairly
rare
that
you
have
the
inverse.
A
All
right,
let's
look
at
the
attributes,
so
basically,
what
I
have
is
here
is:
I
have
simplified
this
significantly.
There
was
a
meeting
that
I
think
I
invited
michaela
too,
but
she
couldn't
make
it
where
we
talked
about
the
encoding
of
the
attribute.
A
I
think
jeremy
was
there
bill
was
there,
I
think
reiner
was
there
and
daniel
was
there,
and
so
basically
one
of
the
problems
was
before
that
we
basically
had
the
platform
name
and
then
the
the
version
broken
out
into
components,
and
there
was
a
lot
of
discussion
about
why
there
we
have
four
version
numbers.
It
seems
very
awkward
to
to
use.
A
Then
michaela
brought
up
independently
of
this,
the
problem
that
it's
fairly
ugly
to
put
these
attributes
on
stuff,
because
you
know
originally,
if
you
look
at
the
usage
side
originally
we
had
things
like
you
know:
name
of
os
platform,
dot,
let's
say:
ios,
comma
14,
comma,
zero,
comma,
zero,
comma,
zero,
comma
zero,
which
normally
these
attributes
are
like
extremely
ugly
to
apply
right,
because
they're
very
lengthy,
and
on
top
of
that
we
have
other
pragmatic
problems
where
the
name
of
will
return.
A
The
name
of
the
field,
but
the
actual
content
of
the
os
platform
field
is
in
a
different
casing.
Then
we
have
this
problem
with
mac
os
right
now,
where
it's
not
entirely
clear
to
me
that
we
will
even
have
mac
os
as
a
member,
whether
we
just
reuse
the
os
x
one.
So
basically
what
we
ended
up
with
saying,
like
you
know
what,
let's
just
ignore
the
whole
version
thing.
A
Let's
just
use
the
exact
same
string
you
put
in
the
project
file
as
one
string
and
then
if
people
aren't
with
magic
strings,
they
can
just
declare
like
their
constants
in
their
project
file
and
we
use
them.
But
then
the
idea
is
you
only
have
as
many
strings
as
os
as
you're
targeting.
So
it's
not
super
busy
and
it
makes
makes
this
thing
slightly
more
readable.
And
so,
if
we
go
down
with
that
path,
then
basically
the
attributes
all
become
very
similar
in
shape.
A
So
I
just
defined
an
abstract
base
type
purely
for
grouping
in
the
docs,
so
that
you
stand
on
this
attribute.
You
can
see
all
the
ones
that
are
derived
from
this
there's
one
that
we
already
talked
about,
which
is
the
target
platform
one.
It
can
only
be
applied
to
the
assembly
because
it
just
records
what
the
assembly
was
compiled
for.
You
cannot
apply
multiple,
because
that
makes
no
sense
right.
A
Multi-Targeting
means
you
produce
multiple
binaries
and
then
each
binary
is
just
one
slice
and
it
kind
of
be
inherited,
because
well
it's
an
assembly
level
attribute
right,
and
then
we
just-
I
guess
this
one
you
can
ignore
this
is
coming
from
here.
I
I
edit
the
base
type
later
so
yeah
basically
know
that
this
basically
just
derives
from
this.
Has
this
platform
name
on
it
and
then
that's
the
end
of
it
so
and
then
the
other
ones
are
similar.
So
we
have
the
minimum
platform
one
this
one.
A
A
So
that's
basically
why
it's
class
constructor
event,
method,
module
property
and
struct
module
is
probably
debatable,
because
I'm
not
sure
how
much
we
care
about
multi-modular
assemblies
these
days,
but,
generally
speaking,
I
don't
see
why
not
and
then
basically
the
idea
here
is
if
this,
if
this
thing
is
applied
to
an
assembly,
it
means
the
entire
assembly
cannot
be
called
into
from
an
earlier
version
by
default.
Right
like
it's
still.
The
way
the
analyzer
will
work
is
that
it
will
walk
the
api
shape.
A
So
if
you
call
an
api,
that's
not
annotated,
we
look
at
the
you
know
the
the
the
containing
type
and
then
it's
containing
type
and
so
on
until
we
reach
the
assembly.
So
that
means,
if
you
mark
the
entire
assembly,
if
you
don't
say
otherwise,
it
means
the
api
is
only
available
on
that
version.
You
can
still
apply
the
attribute
to
the
to
the
to
a
particular
api
to
say
this
one
is
available
earlier
or
later.
So
that's
fine,
because
you
just
override
effectively
what
that
means.
A
But
this
is
basically
the
behavior
you
get
generally
speaking,
it
makes
no
sense
if
it's
lower,
though,
because
if
it
seems
a
bit
weird
to
say
my
project
can
run
a
minimum
on
10.
But
then
you
have
one
api
that
can
be
called
from
nine,
because
that
seems
nonsensical.
So
by
it
by
definition,
you
would
usually
just
annotate
apis
with
later
versions
and
then
yeah,
that's
pretty
much.
The
end
of
that
does
that
make
sense
to
people
so
far.
D
Well,
so,
just
to
be
clear
here
that
means
that
if
you
have
one
class
that
can
be
used
to
describe
whether
or
not
you
expect
things
to
run
successfully,
and
it
therefore
has
a
a
lower
or
in
any
consumption
model,
you
can't
use
the
assembly
level
attribute.
You
have
to
put
the
attribute
on
every
other
class
in
the
assembly.
E
D
C
D
Right
just,
but
there
is
no
this,
this
is
the
default,
but
I'd
like
to
break
out
of
it
and
be
more
general.
It's.
This
is
the
minimum
and
I
can
be
more
restrictive.
Yes,.
A
Yes,
because
that's
kind
of
like
it,
I
your
scenario
makes
sense
in
the
abstract,
but
it
doesn't
make
sense
if
you
consider
how
we
target
things
right,
because
you,
you
can't
really
build
a
an
assembly
like
that
today
right
because
you
have
to
put
a
target
framework
attribute
in
it.
So,
by
definition,
your
whole
assembly
is
at
the
very
minimum
it's
tied
to
what
it
what
you
were
targeting
unless
you
specify
otherwise
right
and
the
minimum
just
gives
you
a
way
to
lower
that.
A
D
A
D
Then,
as
a
practical
question,
so
I
see
that
you
have
both
the
minimum
platform
and
target
platform,
irrespective
of
what
their
final
names
are
as
sealed,
but
the
platform
attribute
you
have
just
a
protected
constructor
on.
Do
you
want
that
to
be
an
internal
or
a
private,
protected
constructor
so
that
it's
not
third-party
extensible.
A
So
we
could,
I
mean,
I
don't
think
it's
a
problem
here,
because
they,
this
is
just
for
grouping
in
the
docs
technically
right,
so
like
there's,
not
really
an
implication
that
an
analyzer
is
supposed
to
handle
all
derivatives
or
platform
attribute
right.
The
analyzers
will
just
look
at
particular
leaf
nodes
right,
so
in
that
sense,.
C
C
A
Yeah
I
mean
like
the
this
came
up
in
the
meeting
that
I
had
with
daniel
and
rainier
like
the
problem.
Is
today
I'm
okay
with
handling
that,
but
to
me
that
is
not
something
that
I
want
to
just
handle
for
the
attributes,
because
we
also
have
to
handle
it
here
right
so
like
that
would
be.
That
would
basically
mean
that
we
would
have
to
come
up
with
some
sort
of
convention
to
separate
the
identifier
from
the
version
number,
and
that
also
needs
to
be
legal
in
the
in
the
in
the
actual
tfm.
D
G
A
Yeah
I
mean
like
the
the
yeah
there's,
also
the
os
2
warp
right,
which
you
all
know
offer
yeah.
Frankly,
you
can
just
put
warp
behind
the
inversion
number,
so
it's
working,
fine,
yeah
yeah.
I
thought
about
this
as
well
like
I
just
don't
think
it's
super
likely,
but
if
you
ever
have
to,
we
can
always
refine
the
parsing.
If
you
ever
have
to
like
technically
mac
os.
A
A
All
right
so
then
we
talked
about
minimum
platform
version,
so
there's
two
more
attributes
which
mckayla
specked
out
originally,
which
is
basically
removed
in
and
obsoleted
in.
So
the
idea
here
is
that,
because
we
have
the
model
that
we
want
to
generally
have
a
singular
sdk
moving
forward,
we
don't
want
to
ship
multiple
sdks
right.
We
don't
want
to
say:
oh
dot,
net
5
supports
you,
know
ios
10
and
up
so
we
have
to
ship
an
ios,
10,
11
and
12
sdk.
A
We
only
would
like
to
ship
the
ios
12
sdk
at
that
point
and
then
just
tell
people
like
yeah.
If
you
want
to
run
on
all
the
versions
just
put
the
mini
version
in
there,
but
that
no
has
the
problem
that,
if
apple
ever
removed
an
api,
how
do
we
do
this?
If
our
sdk
model
is
basically
a
cumulative
right
and
then
it
is
well?
You
just
put
an
attribute
on
this
and
says
yes,
this
was
available
up
until
version
10
and
then
it
was
removed
right.
A
So
you
would
have
a
minimum
and
a
removed
in
platform
attribute
on
the
api,
and
it
tells
you
when
it
was
introduced
when
it
was
removed
and
then
same
same
thing.
Our
analyzer
would
would
tell
you
that
if
you're,
if
you're
running
on
a
platform
potentially
greater
than
that
version,
sorry
equal
or
greater
than
that
version
number,
you
would
give
a
warning
that
tells
you
that
well,
this
api
is
no
longer
there.
So
please
guide
your
call
and
then
obsolete
is
kind
of
similar.
A
It
will
behave
like
our
obsolete,
except
that
it's
also
has
to
consider
the
version
number
you're
targeting
but
same
behavior.
Basically,
I
didn't
put
a
diagnostic
id
here,
because
I
I
think
of
these
as
platform
apis,
so
I'm
not
sure
that
that
they
wore
a
different
diagnostic
id,
because
that's
something
that
apple
would
control
or
android
would
control,
and
so
the
best
we
would
usually
do
is.
We
would
just
tell
people
like
use
the
url,
but
otherwise
we
are
now
in
the
business
of
deciding
oh
yeah.
A
C
A
C
A
C
I
would
say
yeah,
I
would
argue,
an
untranslated
message
is
probably
more
useful
than
no
message.
D
A
Not
to
know
the
things,
this
goes
back
to
the
confusion
that
that
michaela
was
speaking
about
so
think
of
it.
This
way
here,
so
you
think
of
it
kind
of
how
then
reference
assemblies
work
right.
If
you
are
compiling
for
net
five,
you
cannot
see
apis
in
net
six
right,
because
we
give
you
the
reference
assembly
set
that
can
only
contain
up
to
5-0
right.
So
the
the
difference
from
the
os
version
here
is
that
think
of
our
reference
assemblies
as
also
being
annotated.
A
and
then
yes,
the
14
assembly
set,
would
now
tell
you
that
this
api
was
removed
in
14.
But
as
soon
as
you
compile
against
ios
12,
you
will
only
see
up
to
ios
12..
You
can't
see
anything
later,
but
you
will
see
everything
earlier
right,
so
so
that
in
that
sense
you
only
see
backwards
when
you
cannot
see
forwards
in
time.
A
A
All
right-
and
so
these
are
basically
the
the
three
cases
we
have
added
in
removed
in
and
obsolete
it
in
right
and
then
edit
in
we
just
said
it's
minimum,
because
that
makes
more
sense.
C
H
H
A
A
A
For
so
you
should
not
look
at
target
platform
at
all.
You
should
only.
C
C
C
A
C
Something
that
hasn't
been
said,
but
I
think
it
is
probably
worth
clarifying-
is
that
your
targ,
if
you
don't
specify
a
minimum
os
platform,
then
the
build
will
automatically
burn
in
the
your
target
platform
to
to
be
that
value
right.
Because
if
your
target
platform
is
ios
14
and
you
don't
explicitly
say
I'm
supporting
an
older
os,
then
it's
going
to
assume
that
your
minimum
is
14.
right,
so
that
burned
in
at
compile
time.
A
All
right
so
then
attributes
are
covered.
Then
we
can
talk
about
os
platform
and
runtime
information.
So
one
thing
that
has
come
up
before
which
you
should
also
talk
about,
is
what
do
we
do
with
the
existing
environment
west
version
thing,
but
before
we
go
there,
let's
first
focus
on
these
guys
here.
So
the
reason
we
have
these
ones
here
was
for
two
reasons.
One
of
them
was
well.
We
our
existing
os
platform,
so
our
existing
environment.os
version
has
some
enum
for
oss,
which
are
no
longer
that
great.
A
So
we
basically
don't
want
to
use
those,
but
the
version
number
that
is
returned
by
it
is
still
valid,
but
basically
we
wanted
also
to
make
sure
that
people
don't
really
do
version
comparisons
themselves,
and
basically
that's
why
we
have
this
api
here,
where
you
basically
say
are
you
this
platform,
and
then
we
say
yes,
no
one
design
that
falls
out
of
this
is
that
we
can
be
multiple
platforms
at
the
same
time
now
this
may
sound
weird,
but
it's
actually
not
that
weird,
because,
for
example,
we
have
linux
and
we
have
freebsd
right.
A
So
we
can
say:
yeah
freebsd
is
a
form
of
linux,
but
it's
more
specific
to
say
it's
freebsd.
So
in
that
sense,
if
you,
if
you
ask
like
your
linux,
yes,
are
you
freebsd?
Yes,
and
so
in
that
way,
we
can
also
support
this.
A
I
think
that
earlier
than
you
know,
ipad
os,
maybe
it's
a
specialized
form
of
ios,
so
maybe
ipad
os
would
say.
Ios
is
yes
and
ipad
will
also
say.
Yes,
if
you
ever
add
it
right.
A
That's
why
we
kind
of
have
this
inverse
logic
where
you
pass
in
what
you
want
to
query
for,
and
we
tell
you
whether
that's
true
or
not,
rather
than
we
tell
you
who
we
are,
because
that
will
make
it
very
hard
for
us
to
add
refined
choices
over
time.
In
that
spirit,
we
basically
basically
said.
Okay,
maybe
we
should
have
another
api
that
is
similar
to
the
version
checks
that
the
windows
guys
came
up
with,
which
is
use.
A
You
ask
for
the
version
and
we
do
the
comparison
for
you,
and
so
this
is
the
same
here.
We
basically
say:
here's
the
westbound
we
want
to
check
for
and
then
we
just
you
can
pass
it
up
to
four
version
numbers
right.
People
suggested
to
use
the
version
struct
here,
but
I
think
that
makes
it
just
harder
to
write
the
call
and
it
also
makes
it
harder
to
analyze.
A
So
that's
why
I
didn't
do
that.
But
basically,
yes,
you
can
just
pass
it
up
to
four
version
numbers
and
then
we
have
the
inverse
as
well,
which
is
the
lowercase
check.
Why
is
it
lower
and
not
lower
or
equal
to?
Well,
because
if
you
want
to
check
whether
you
know
should
am
I
allowed
to
call
this
removed
in
api,
you
want
to
pass
in
the
version
number
where
the
api
was
removed
in
right.
That's
why
I
said
okay,
it
makes
more
sense
of
an
api
like
this.
A
Where
you
can
say
yeah,
you
can
call
this
removed
api.
If
it's
an
earlier
version,
then
whatever
version
number,
the
api
was
removed
in
right
same
with
obsolete
it,
and
so
that's
the
only
reason
why
you
want
to
have
the
inverse
case
by
and
large.
I
expect
most
people
to
use
this.
One,
though,
does
that
make
sense
to
people.
E
A
E
A
A
C
I
Emo
a
quick
comment
on
this.
I
know
you
said
you
didn't
want
to
use
the
version
type
in
these
parameters,
but
it
might
be
good
at
least
just
to
have
an
overload
that
takes
them
just
in
case.
Someone
already
has
an
instance
of
that
floating
around.
A
C
A
C
C
That's
that
also
brings
up.
Maybe
we
should
maybe
we
should
have
the
analyzer.
Give
you
a
warning
if
you
use
variables
in
in
these
calls.
D
Oh
yeah,
we
talked
about
the
literal
expected
for
some
of
the
stuff
in
intrinsics
and
it
seems
like
this
would
be
if
we
had
that
attribute,
we
would
put
it
here,
but
we
just
may
put
that
in
the
platform
compat
analyzer
of
like
hey,
I
I
don't
know
what
it
means
to
be.
Is
it
am
I
later
than
version
x
where
x
was
passed
into
this
function?.
D
D
G
D
I
Well,
it's
not
just
that,
but
if
you
look
at
what
we
do
in
our
unit
tests
like
our
unit
tests
literally
introduce
helper
methods,
is
windows
10,
rs5
or
later,
and
we
call
those
helper
methods
which
would
delegate
to
these.
But
if
those
helper
methods
are
used
to
guard
a
call
site,
will
things
fall
apart?.
I
A
But
then
help
me
understand
why
these
helper
methods
would
be
easier
than
basically
a
very
simple
version
of
these
apis
like
why
can't
we
make
the
call
these
apis
as
simple
as
your
helper
method,.
I
No,
what
I'm
saying
is
I,
if
I'm
trying
to
guard
a
feature
that
exists
on,
like
I
said,
rs5
or
something
I'm
not
going
to
want
to
have
these
call
sites
all
throughout
my
code,
saying:
okay,
os
platform,
dot,
windows,
comma
10,
comma
19485
or
whatever,
like
I'm,
I'm
going
to
want
to
wrap
all
of
that
into
a
single
helper
method
just
called
like.
Can
I
call
this
api?
Yes
or
no?
Oh,
as
you.
A
Were
just
saying
right
in
that
case
I
mean
this
goes
back
to
the
string
right.
If
we
would
take
a
simple
string,
you
could
just
define
that
that
string
in
your
project
file
and
you
would
just
name
the
string-
feature
x,
availability
and
you
would
just
say
this.
Is
you
know,
windows,
rs5
or
whatever.
D
Yeah
and
I
think
that
people
would
be
very
apt
to
write
the
helpers
if
we
did
these
across
two
releases,
but
if
the
analyzer
that
you're
hoping
will
help
you
and
the
requirements
from
that
analyzer
come
in
the
same
time
that
these
apis
do
that's
an
immediate
disincentive
to
to
write
the
helpers
and
but
yeah.
So
I
think
the
string
will
help
make
the
code
be
more
legible
and
easier
to
reason
about,
and
it's
no
more
complexity
on
the
analyzer.
Given
that
we've
already
made
it
interpret
the
string
from
the
attribute
so.
A
Yeah
so
now,
let's
talk
about
the
controversial
stuff,
actually.
A
A
D
That's
easy:
we
in
runtime
information
it's
cross
compiled
and
the
dll
knows
it
was
os
x
and
it
just
it
says,
return
true.
If
you
asked
for
os
x
and
false
for
anything
else,
once
we
get
the
string
that
you
need
to
turn
that
back
into
the
identifiers,
we
understand,
which
means
we
need
the
string
parser
to
ship
as
part
of.
I
We
we
don't
actually
need
to
turn
it
back
into
the
identifiers,
because
we
can
actually
special
case
that
within
the
runtime
itself,
for
instance,
if,
if
I'm
running
on
windows-
and
I
receive
a
version
string,
that
literally
does
not
begin
with
the
characters
w.
I
n
dash,
like
just
return
false,
fair
enough.
A
I
mean
yeah.
The
only
thing
you
basically
have
to
carry
is
yeah,
like
every
slice
of
the
build
needs
to
know
its
aliases
right,
but
you
don't
have
to
have
total
knowledge
ever
right,
which
is
probably
good
enough,
because
it
just
means
today
you
already
have
to
say
if,
if
mac
os,
true,
you
say
well,
if
mac
os
or
osx
equals
two
right,
like
I
mean
that
doesn't
seem
terrible.
I
A
I
A
Yeah,
that's
the
whole,
but
now
that's
that's.
Actually
a
nice
segue
to
the
controversial
thing.
So
we
have
today
an
entry
called
osx
on
os
platform
because
we
already
shipped
this.
You
know
three
years
ago.
Whatever
then
we
called
it
osx
at
that
point
and
of
course
it's
not
called
osx
anymore,
it's
called
mac
os.
Now
I
originally
had
the
mac
os
field
in
here
or
property.
I
should
say,
and
then
I
received
feedback
like
already
have
was
x,
remove
it.
A
I
I
expect
the
or
the
friends
like
michaela
and
others
who
build
the
the
other
side
of
the
house,
not
be
super
happy
with
that.
So
now
the
question
is:
are
we?
Are
we
going
down
this
path?
Are
we
saying
no
just
have
a
mac
os
property
here
and
just
make
it
an
alias
for
osx.
D
D
Existing
assemblies
that
already
have
it
mean
they
can't
roll
forward.
That's
a
binary.
Breaking
change
like
you
can't
have
built
net
standard
to
you'll,
build
net
standard,
2o
and
you'll
crash
on
net
5.
I
A
B
So
you
I
think,
somewhere
in
here
and
you
talk
about
combining
multiple
platform
checks.
So
if
you
do
need
to
you
know,
if
your
code
does
need
to
check
is
os
platform
or
later
against
multiple
things.
If
the
yeah,
I
think
people
are
still
going
to
want
to
write
helper
methods
to
wrap
those,
so
I
don't
know.
B
D
I
mean
if
we
wanted
to
support
helper
methods
like
that,
then
we
could
do
because
so
c
or
the
latest
version
of
the
c
sharp
compiler
for
nullability
has
the
you
can
put
an
attribute
on
a
member
that
says
it.
It
makes
this
field
a
particular
field,
not
null,
so
we
could
have
a
return
based
attribute
or
just
a
simple
attribute
on
a
member
that
is
like
guarantees,
minimum
version,
and
then
you
know
takes
one
of
these
platform
strings.
So
we
could.
B
A
Basically,
what
you
would
want
is
kind
of
an
assert
attribute
at
that
point
right
where
you
say
this
method
is
asserts
that
you
know
the
lower
bound.
Is
this
and
the
upper
bound
is
this
right?
A
It
returns
true,
if
that's
the
basically
it's
something
like
the
you
know,
which
you
know
false
if
or
whatever
we
called
it
inaudibility,
where
we
say
the
return
value
is
corresponding
to
this
condition
right.
That
is
possible,
like
I,
I
would
think
like
to
me
that's
kind
of
refinement
of
the
analyzer
like
I'm,
not
convinced
that
we
need
it
yet.
D
A
And
it
would
be
the
example
that
jeff
had,
which
would
be
if
you
combine
them
as
a
compound
expression,
where
you
say:
random
information
is
os
platform
or
later
and
is
os
platform
earlier
than
blah
right.
Basically,
if
you
want
to
have
a
range
check,
but
even
then,
I
would
argue
that
the
range
check
probably
reads
easy
enough,
and
it's
probably
in
a
few
enough
cases
that
it's
probably
fine.
A
B
D
Honestly,
like
it
depending
thinking
of
how
the
analyzer
probably
works,
though
I
have
no
idea
how
the
state
flow
stuff
actually
works,
because
I
I
skipped
that
in
my
analyzer's
introduction,
essentially
it's
you
hit
this.
If
and
then
inside
that
lexical
scope,
you
push
a
new,
I
now
have
a
new
minimum
guarantee
for
ios
and
like
so.
A
A
This
is
also
control
flow,
because
b
only
gets
executed
when
a
was
false
right,
so
they
give
basically
a
complete
control
flow
graph
for
the
method
and
then
basically,
what
the
analyzer
does
it
effectively
has
methods
like
you
know,
create
state
and
then
merge
state
right
where,
basically,
when
you
have
nodes
that
are
joining,
you
basically
merge
the
states
from
from
from
both
branches,
and
so
the
state
in
our
analyzer
case
is
basically
what
is
the
asserted
minimum
version
and
what's
this
sort
of
maximum
version,
and
then
you
know
when
you,
when,
when
the
state
is
basically
flown
to
the
through
the
to
the
graph,
well
you're,
effectively
combining
these
states
right
and
then
at
a
given
point
in
time.
A
You
can
say
well
looking
at
this
code
here
now
based
on
the
state.
What
what
can
I
assume
the
minimum
and
the
maximum
to
be
right
and
that's
basically
what
we
would
do?
It's
not
super
complicated
like
it's
it's
fairly
straightforward,
given
that
there
wasn't
a
team,
now
has
an
actual
api
that
does
the
flow
for
us.
The
only
thing
we
have
to
do
is
basically
construct
the
the
state
right
and
override
the
methods.
D
But
so
it's
when
you
get
into
the
I've,
you
know
I've
hit
a
flow
node
and
I
need
to
push
data
into
it.
It
would
be
go
copy.
The
you
know
asserts
minimum
version,
all
those
nodes
into
your
min
version
state
bucket
and
asserts
maximum
version
or
asserts
less
than
version
into
your
upper
bound
state.
So
like
right,
we.
C
A
A
Add
to
our
analyzer
is
probably
environment,
os
version,
because
there's
probably
a
fuckton
of
code
that
does
that
today
and
so
the
problem
with
that.
Is
that
basically
it's
not
what
I
said
earlier
right
like
because
you
have
not
a
simple
method
like
here:
you
basically
have
a
you,
know.os
equals
or
dot
major
is
less
than
or
whatever,
and
so
extracting
what
the
person
actually
was
asking
is
fairly
non-trivial,
because
there's
just
you
know
a
huge
tone
of
combinations
that
you
could
interact
with
right.
A
The
bigger
problem
with
runtime
with
environment
os
version
is
that
forgot
what
the
name
is,
but
the
os
kind
enum
that
we
return
is
completely
busted
at
this
point,
because
many
of
the
members
don't
make
sense,
so
I
think
the
best
we
can
probably
do
is
we
can
say
we
can
extract
the
version
number.
Maybe.
A
But
if
the
person
tried
to
detect
the
operating
system,
then
we're
probably
out
of
luck,
but
I
don't
know
how
you
how
you
extract
than
the
os
at
all,
because
I
mean
maybe
you
can
say
well
if
we
know
that
the
project
was
targeting
dot
net
framework,
we
can
assume
it's
windows,
but
but
then
pretty
much.
That's
the
end
of
it
right
as
soon
as
the
target
net
crap.
Like
I
don't
know
what
a
version
check
by
itself
would
mean.
B
A
A
B
B
Yeah
with
regard
to
the
analyzer
for
runtime,
we're
still
going
to
guard
you,
but
if
you
want
the
analyzer
to
work,
as
you
said
before,
jeremy,
by
shipping,
these
at
the
same
time,
we'll
then
get
that
feedback.
And
then
we
just
need
to
ask
folks
where
the
pain
points
are
and
see.
If
we
need
to
add,
you
know,
potentially
add
more
helper
functions
or
attributes
and
and
in
conjunction
with
that,
enhance
the
logic
of
the
flow
determine
flow
logic
in
the
analyzer.
D
B
D
E
Helpers,
do
we
know
how
how
complicated
it's
going
to
be
to
get
the
jit
to
recognize
these
as
constant
given
os
platform
is
a
struct
that
contains
an
opaque
string,
and
similarly,
I
guess
for
the
analyzer,
if
someone
defines
their
own
os
platform.
Static.
Read-Only,
for
example,
is
the
analyzer
going
to
be
able
to
correctly
recognize
what
the
string
constant
for
the
os
platform
is
no.
A
I
mean
same
thing
like
basically,
if
you
don't
pass
in
directly
os
platform.blah,
like
I
would
say,
that's
the
same
thing
as
if
you
pass
a
variable
to
the
version
number
like
we
don't
know,
because
otherwise
you
would
have
to
do.
The
problem
is
first
of
all,
you
would
have
to
do
data
flow
to
find
the
original
thing,
but
even
data
flow
might
not
be
sufficient
right,
because
this
thing
might
be
initialized
by
the
constructor
or
a
different
assembly,
oh
yeah,
and
then
it's
like.
A
G
D
B
D
Right-
and
I
don't
think
it's
I
mean
yes,
performance
is
good
to
care
about,
but
I
don't
think
it
matters
if
the
jet
can
optimize
this
or
not,
because
it
means
that
you're
doing
complicated
things.
And
if
you
want
to
do
simple
things,
just
say
your
minimum
version
is
your
minimum
version
or
say
that
your
target
version
is
your
minimum
version
and
you
never
have
any
of
these
checks.
E
A
E
Right
for
a
lot
of
these
apis,
I
don't
think
that's
necessarily
a
good
idea.
It's
similar
to
intrinsics,
where
you
might
have
an
algorithm,
which
is
essentially
the
same,
except
for
this
one
particular
call
you're
going
to
want
to
decide.
E
Do
I
do
blend
or
do
I
do
and
and
not
or
and
which
one
you
do
is
going
to
be
used
in
that
one
spot
in
a
hot
loop
and
you're
going
to
want
the
jit
or
the
aot
compiler
to
go
and
drop
the
dead
code
path,
essentially
to
make
sure
that
it
is
as
optimal
as
possible.
It's
not
going
to
be
this
high
level
check
with
a
bunch
of
code.
You
duplicate
five
times
over.
E
Right
right
now,
it
is
not
a
jet
constant
and
there's
been
complaints
from
people
about
it,
causing
perf
issues
in
their
hot
pads.
A
E
Think
there
would
be
jet
work
required
to
recognize
os
platform
properties
here
as
intrinsic
and
then
track
what
they
are.
With
regards
to
other
checks
to
know,
okay,
the
user's
passing
in
os
platform
android,
the
other
four
parts
are
constant.
So
therefore
we
can
emit
a
constant
check
and
fold
it
down
to
a
gt,
true
or
gt
false.
A
C
A
E
E
E
For
this
particular
scenario,
we
would
know
what
os
we're
running
on
already
and
then
we
could
query
what
version
we're
running
against
and
cache
that
and
then,
when
you
encountered
such
a
check,
the
jet
could
fold
against
fold
the
values
passed
in
against
the
values
that
it
has
cached
and
decide
to
to
convert
that
call
into
a
constant,
true
or
false,
which
then
allows
the
dead
code
to
go
away.
A
A
E
Yep-
and
we
have
to
do
that
for
things
like
math.sine
and
round,
and
things
like
that
anywhere,
where
we
want
to
support
constant
folding,
you
have
to
have
something
that
the
jet
can
hold
against.
D
But
you
know
the
for
the
general
problem.
You
know
I'm
aware
that
making
an
artificial
class
hierarchy
with
a
virtual
member
and
then
hoping
for
de-virtualization
is
not
grand,
but
it
does
get
you
at
least
the
the
one-time
wait.
This
was
the
only
object
that
got
created.
I
know
exactly
where
it's
going.
It's
sealed
stop
doing,
vert
calls
and
just
jump
to
the
address
and
it's
more
work.
You
have
to
do
in
your
code,
but
until
we
can
make
the
jet
smarter
it
solves
the
problem.
A
Yeah,
that's
fair,
I
think
the
I
think
starting
summer
is
probably
good
a
good
a
good
point.
I
mean
I
will.
I
will
start
the
discussion
with
the
team
and
then
see
how
much
work
that
is,
but
I
think
we
should
first
start
implementing
the
methods
anyway
to
just
get
a
sense
for
what
it
would
take.
H
Finished
this
api.
Sorry,
could
we
take
a
look
on
the
analyzer
issue.
F
A
I
mean
that's
one
of
the
questions.
I
asked
my
niche
like
to
me
the
debugger.
The
debugger's
third
case.
Is
that
really
the
way
they
should
that
should
be
handled
is
by
the
control
flow
engine
already,
because,
logically,
they
know
that
if
the
condition
is
false,
they
should
basically
treat
the
result.
This
unreachable
code-
and
I
think
he
said
they
will
they're
they're
doing
that
the
compiler
doesn't
do
that,
but
we
don't
use
the
compiler
flow
analysis.
We
use
the
the
flow
analysis
that
they
wrote
for.
H
D
A
I
would
have
used
yakni
but
yeah
same
same
answer.
All
right,
then
I
guess
I
keep
doing
this.
A
H
H
H
A
A
Yeah
so
like
when
I
wrote
this,
I
tried
to
write
it
in
a
simple
way,
but
apparently
it's
more
complicated.
Then
then
I
would
have
written
differently,
but
basically
so
what
I
tried
to
say
in
the
spec
when
I
said
platform
context,
it's
basically
the
idea
that
the
way
the
analyzer
logically
works
right.
It
basically
looks
at
every
method
call
or
any
any.
You.
C
A
Is
that
the
call
side
has
different
kinds
where
the
guarantees
are
coming
from
right?
One
is
the
global
context,
which
is
the
you
know.
Is
the
project
itself
specifying
anything
right
and
so
the
we
can
probably
ignore
this
entirely,
because,
logically,
now,
this
whole
stuff
is
caught
by
this
stuff.
A
H
H
H
H
A
So
you
always
have
to
basically
say
well.
Is
the
containing
method
attributed
no
if
it's
containing
type
attributed?
No,
if
it's
containing
assembly
annotated
and
like?
Basically,
you
basically
walk
this
list
inward
to
outward
and
then
the
first
hit
is
basically
telling
you
what
the
version
number
is
and
then
for
the
most
time
here,
you
will
basically
walk
all
the
way
up
to
the
assembly,
and
then
you
say:
oh
this
only
says
it's
12,
so
I
guess
12.
It
is.
A
C
A
As
early
as
possible,
like
if
the
api
that
you're
calling
isn't
platform,
specific,
there's
no
point
in
walking
right,
yes,
and
so
that
that
already
cuts
down
90
of
the
call
sites.
And
then
you
only
do
the
walk
for
the
for
the
things
that
perform
specific.
But
there's
no
really
a
way
to
to
to
to
shortcut
that
and
then
the
only
other
shortcut
you
have
is
the
the
next
line
here
right.
So
the
so
the
flow
analysis
yeah.
You
try
to
shortcut
that
as
well.
You're,
basically
saying,
and
we
only
do
the
flow
analysis.
C
A
Right
and
then
and
then
you
do
the
fallback
and
say
yep.
Okay,
now,
let's
actually
walk
the
call
graph,
I
should
say
the
control
flow
graph
and
so
yeah
so
this
so
this
check
is
really
expensive.
C
C
H
A
Falls
out
because
the
thing
is
you
basically
just
look
for
minimum
os
platform
attribute
right.
So
if
the
project
itself
is
net
five,
we
will
not
burn
in
the
the
or
the
minimum
wise
platform
attribute
right.
So
that
means
the
way
you
detect
that
the
assembly
is
neutral
is
by
basically
just
saying
well,
do
you
have
a
minimalist.
C
H
A
A
D
I
mean
the
ms
build
wouldn't
know
if
you've
injected
the
assembly
and
assembly
info.cs
manually
like
it.
If
you
didn't
use
the
properties,
it
can't
warn,
but.
D
C
D
G
D
Because
that
would
just
be
the
again
when
figuring
out
for
this
type,
the
first
time
you
have
to
resolve
it
and
it's
like.
Oh
it
has
the
attribute.
Well
now,
let's
compare
it
to
the
assembly
attribute,
hey,
that's
an
inverted
relationship,
produce
a
warning
and
maybe
the
whole
analyzer
shuts
down,
because
who
cares
you're
in
a
broken
state
at
this
point,
but
but
the
yeah
just
figuring
out
what
what
the
error
conditions
are
here
since
so
many
manual
attributes
have
to
be
applied.
B
D
D
H
Well,
I
I
didn't
exactly
understand
that
jeremy's
point
but
but
for
others
I'm
good.
A
H
D
Right,
just
yeah
emo
had
suggested
that
a
if
an
assembly,
a
class
and
a
method
all
have
the
attribute
they
have
to
either
or
they
have
to
be
getting
more
and
more
restrictive.
Instead
of
you're
allowed
to
get
more
permissive.
And
then
I
felt
like
asking
the
question
of:
is
the
analyzer
checking
that
or
is
the
analyzer.
H
A
Yeah,
so
the
way
so
the
way
analyzer
works
is
that
you
basically
can
decide
what
you're
walking,
and
so
I
would
say
you
should
probably
have
in
the
registration
where
we
say
what
we
want
to
walk.
We
should
also
walk
the
declared
symbols
in
the
in
the
project,
so
that
means
you
would
basically
walk.
You
know
every
every
declared
type
method
and
so
on
once
and
you
basically
just
compare
the
minimum
os
platform
version
if
it's
present,
with
the
target
platform
version
and.
C
A
D
D
D
A
A
I
I
You
had,
I
think
you
had
started
talking
of
a
minute
or
so
ago,
but
cut
out.
H
H
Yeah,
if,
for
example,
tfm
doesn't
have
any
like,
has
always
specific,
like
ios
whatever
but
doesn't
have
the
versioning,
then
right
now
it
will
be
like
zero
zero
zero
for
my
in
my
calculation
because
the
versions
are
required,
but.
A
E
A
So
that's
so
I
haven't
called
this
out
here,
but
it's
called
in
the
tfm
spec.
So
basically
the
idea
is
that
is,
I
guess
you
don't
have
an
example
here.
So
if
you
omit
the
version
number
in
the
project
file
that
like
doing
build,
we
know
what
version
number
this
is.
So
the
idea
is
that
if
you
say
net
5
dash
ios
with
no
version
number,
the
sdk
knows
well
net
5
ships,
initially
with
ios
10.
So
then
the
attribute
that
we
generate
will
have
10
in
it.
A
So
that's
why,
generally
speaking,
you
shouldn't
look
at
the
tfm.
You
should
just
look
at
the
generated
attribute
and
the
attribute
will
always
have
a
version
number
there's,
no
such
thing
as
a
version
less
tfm.
In
that
sense,
it's
just
it's
just
convenience
that
the
person
had
didn't
have
to
specify
it
in
the
project
file.
A
A
So
basically,
if
you
omit
the
version
number,
it
will
always
mean
the
same
version
number
and
like
at
build
time.
You
will
know
what
that
version
number
is
because
it's
hardwired
into
the
sdk
and
so
the
like.
Even
if
you
omit
the
version
number,
if
the
version
number
that
we
bundled
with
net
5
was
ios,
12
target
platform
will
still
say:
ios
12
and
then,
if
you
didn't
specify
this
property
here,
then
we
just
set
it
to
this
one.
A
F
A
A
Well,
if
well,
if
they
are
present,
they
will
have
a
version
number
if
they're
not
present.
It
means
this.
The
the
the
assembly
is
platform
neutral,
which
means
you
shouldn't
be
able
to
call
any
platform
specific
apis.
A
So
my
goal
is
so
once
this
attribute,
so
today
we
approved
this
one
here
right
so
like
my
next
task
is
doing
exactly
that,
like
going
over
the
apis
that
we
know.
So
let
me
start
differently
about.
We
have
this
guy
here,
github.com
platform
compatibility,
which
was
our
first
analyzer,
and
this
one
basically
has
a
database
effectively
right,
which
is
a
glorified
way
to
say.
There's
a
csv
file
and
the
csv
file
tells
us
what
is
windows
specific,
and
so
I
will.
A
E
A
I
was
thinking
about
that.
We
will
probably
not
do
that,
because
the
only
way
you
can
reference
them
is
by
targeting
the
platform
specific
tfm
already.
So
the
only
reason
why
the
attributes
would
be
useful
is
for
version
information,
but
given
that
both
wpf
and
winforms
are
supported,
all
the
way
back
to
win7
and
bin7
is
the
minimum
that
we
support
in
general.
It's
just
overkill
at
this
point.
A
Okay,
so
like
this
is
only
when
you
compile
for
n5
right.
Otherwise,
you
won't
see
the
attributes
to
begin
with.
A
Right
so,
but
I
mean
so,
I
asked
this
the
winform
stream
at
some
point
because
they
said,
like
you,
keep
adding
these
new
apis.
How
many
of
them
are
actually
supported
on
all
platforms,
that.net
core
runs
on
and
so
far
everything
they
added
is
supported
everywhere.
So,
but
eventually
they
may
have
a
property
that
only
works
when
you're
on
wind10
or
up
or
something
right.
And
then
we
may
actually
put
the
attribute
on
those
guys
as
well.
A
Yeah,
I
think
that's
true,
but
I
think
registry
is
a
good
example
right.
I
would
probably
just
mark
all
of
registry
as
win
seven
right.
A
D
D
If
it's
not,
that's,
I'm
just
see
also
the
discussion
of.
Do
we
want
to
have
the
high
level
review
of
every
nullable
annotation
that
has
been
added
in
the
last
year.
How
much
time
do
we
need
to
spend
on
painting
assemblies
with
stuff
that
we
shipped
20
years
ago.
C
Right,
it's
very
much
this
this
whole
thing
very
much
came
out
of
like
this
is
what
ios
and
android
do
already
so.
Can
we
make
the
experience
better
there
and
then
a
logical
progression
is
okay.
If
things
in
in
in
corefx
have
the
same
problems
or
then
it
makes
sense
to
apply
there,
but
that's
not
so
much
the
primary
goal,
more
more
logical
progression.
D
And
I
assume
for
the
concept
formerly
known
as
xamarin,
that
this
is
already
being
taken
care
of
for
where
it's
exposing
the
platform
apis
right.
C
C
The
annotations
exist
just
it's
not
using
these
exact,
these
exact
attributes.
Of
course,
they
have
their
own
attributes
right.
Man.
A
Yeah,
I
think
to
me
it's
important
that
we
get
the
broad
strokes
right
right.
It
would
be
pretty
dumb
if
registry
wouldn't
be
annotated
right.
That
seems
like
a
wmi
wouldn't
be
annotated
right
or
a
system.directory
services
wouldn't
be
annotated,
because
we
know
that
they're
all
windows
specific
right
well.
A
Okay,
so
then,
maybe
no
longer
but
like
like
that
for
a
very
long
time
was
windows
only
right,
because
we
just
walked
into
windows.
If
we
don't
have
a
for
implementation,
that's
great
yep.
H
D
Yeah
in
here
emo
have
you.
I
assume
you've
specced
out
what
it
means
for.
D
D
Right
so
ios
13,
which
is
about
halfway
in
the
screen
right
now.
That
will
be
true
for
13
rtm
and
13.1
and
14
and
etc,
but
not
12.9,
which
is
it
sounds
very
stupid
to
say
this
out
loud.
But,
as
you
said,
system.version
has
different
feelings
on
does
13.0.0.
D
A
A
Yeah,
like
I
mean
vertical
numbers,
are
always
four
components
right
so,
like
you
might
as
well.
Okay,
I
mean,
I
sincerely
hope
nobody
ever
does
that,
but
I
think
to
michaela's
point
earlier
right.
I
do
think
we
probably
never
use
it
for
the
for
the
os
version
right,
but
we
may
actually
end
up
doing
it
for
the
sdk,
because
if,
if
you
have
you
know,
if
a
platform
uses
three
digits
to
indicate
its
support
for
apis
well,
then
maybe
we
need
to
rev
our
sdk
one
more
step
right.
D
C
D
New
api,
then
we
would
have
needed
three
characters
and
then
is
there
a
just
asking
a
high
level
question?
Is
there
a
notion
that
someone
might
want
to
use
this,
for
I
know
that
there
was
a
bug
in
10.14.0
and
I
don't
run
unless
you
have
10.14.1
or
higher,
or
is
that
a
non-goal
for
this.
A
No,
that's
the
same
thing
that
we
do
for
targeting
packs
right.
We
do
not
allow
you
to
pre-rack
bug
fixes
I
mean
you
can
of
course
use
the
ap,
the
the
apis.
We
have
to
check
for
that
but
like,
and
we
can't
really
stop
you
from
doing
that.
Right,
I
mean
you
can
totally
annotate
your
assembly
with.
I
require
the
minimum
version
number
10.3.4.2
and
you
will
get
the
right
behavior
out
of
the
system,
but
you
wouldn't
be
able
to
express
that
as
tfm's
right
so
like.
C
A
E
H
I
have
a
question
for
the
attribute
versioning,
so
now
they
don't
have
separate
version
and
it
will
be
attached
to
the
string.
So
that
means
like
not
all
the
version
parts
are
not
exist.
I'm
thinking
just
if
it
says
like
I
was
13.
Then
if
there
is
another
annotation
found
like
suppressing
annotation
or
something
found
like
a
ios
13.1
or
whatever,
then
I
I
would
just
ignore
the
missing
part
or
make
it
zero.
B
D
A
H
H
I
mean
if,
if
the
numbers
are
missing,
then
for
example,
I
have
one
attribute
13
ios
13
attribute
in
the
calling
method,
and
but
that
method
is
suppressed
with
the
13.1
then
for
evaluating.
If
I
need
to
warn
it
or
not,
I
just
ignore
the
missing
part
like
just
check
for
that
numbers.
13
like
first
major
and
ignore
the
remaining
part.
D
A
We
solved
it
in
one
pass:
yeah.
Well:
okay,
I'll
update
the
analyzer
spank
with
the
things
we
talked
about,
including
the
attributes
that
we
know
approved,
and
I
will
call
out
some
other
details.
A
Cool
then
I
wish
you
guys
a
great
weekend.
Everybody
will
see
you
later
today.
I
see
you
later
today
and
then
enjoy.